Files
linux-odyssey/quests/copy/game.yml
T
Justin Lin 3b77d91796 Quest: remove unnecessary ls-stages (#195)
* quest: remove ls-stages in create

* feat: prevent throwing errors when failed to copy files

* feat: log new command in dev mode

* quest: copy

* quest: mv

* quest: rm

* quest: execute. Add many exceptions

* feat: pwd discovers parent folders
2025-04-30 15:01:25 +08:00

347 lines
11 KiB
YAML

id: copy
title: 複製檔案
image: base
instruction: |
在這個關卡中,你將會學到:
1. 如何使用 `cp` 複製檔案
requirements:
- create
stages:
- id: start
name: 按下 `開始` 按鈕開始
condition:
command: echo start
response:
content: |
今天我們要學習如何複製檔案。
先用 `ls` 指令查看目前資料夾裡有哪些檔案。
hint: 使用 `ls` 來查看目前資料夾裡有哪些檔案
- id: ls
name: 查看目前資料夾裡的檔案
requirements:
- start
condition:
pwd: /home/commander
command: ls
exceptions:
- id: wrong_directory
condition:
not:
pwd: /home/commander
response:
content: |
你不在 `/home/commander` 資料夾裡。
請使用 `cd /home/commander` 來返回 `/home/commander` 資料夾。
response:
content: |
可以看到現在資料夾裡有 `hello.txt` 跟 `world.txt`。
請使用 `cat` 來查看它們的內容。
看完之後,使用 `echo next` 來繼續吧!
hint: |
使用 `cat hello.txt` 以及 `cat world.txt` 來查看檔案內容
如果終端機卡在某個指令無法輸入,請按下 `Ctrl + C` 來取消該指令
- id: cat-hello
name: 查看 `hello.txt` 的內容
requirements:
- ls
condition:
pwd: /home/commander
command: cat hello.txt
output: Hello
exceptions:
- id: wrong_directory
condition:
not:
pwd: /home/commander
response:
content: |
你不在 `/home/commander` 資料夾裡。
請使用 `cd /home/commander` 來返回 `/home/commander` 資料夾
- id: missing_command
condition:
command: cat
response:
content: |
你忘記輸入 `cat` 了嗎?
請輸入 `cat hello.txt` 來查看 `hello.txt` 的內容
- id: missing_extension
condition:
command: cat hello
response:
content: |
你忘記輸入 `.txt` 了嗎?
請輸入 `cat hello.txt` 來查看 `hello.txt` 的內容
response:
content: |
你成功查看到 `hello.txt` 的內容了!
內容是:
```
Hello
```
- id: cat-world
name: 查看 `world.txt` 的內容
requirements:
- ls
condition:
pwd: /home/commander
command: cat world.txt
output: World
exceptions:
- id: wrong_directory
condition:
not:
pwd: /home/commander
response:
content: |
你不在 `/home/commander` 資料夾裡。
請使用 `cd /home/commander` 來返回 `/home/commander` 資料夾
- id: missing_command
condition:
command: cat
response:
content: |
你忘記輸入 `cat` 了嗎?
請輸入 `cat world.txt` 來查看 `world.txt` 的內容
- id: missing_extension
condition:
command: cat world
response:
content: |
你忘記輸入 `.txt` 了嗎?
請輸入 `cat world.txt` 來查看 `world.txt` 的內容
response:
content: |
你成功查看到 `world.txt` 的內容了!
內容是:
```
World
```
- id: cat-next
name: 輸入 `echo next` 來繼續
requirements:
- cat-hello
- cat-world
condition:
command: echo next
response:
content: |
接下來我們要來學習如何複製檔案。
`cp` 這個指令,是 copy 的縮寫,就是複製的意思。
我們可以用 `cp [來源檔案] [目的檔案]` 的方式來複製檔案。
請你使用 `cp` 來複製 `hello.txt` 的內容到 `hello2.txt`。
hint: 使用 `cp hello.txt hello2.txt` 來複製 `hello.txt` 到 `hello2.txt`
- id: cp-hello
name: 複製 `hello.txt` 到 `hello2.txt`
requirements:
- cat-next
condition:
pwd: /home/commander
command: cp hello.txt hello2.txt
files:
- path: /home/commander/hello2.txt
type: file
exists: true
exceptions:
- id: wrong_directory
condition:
not:
pwd: /home/commander
response:
content: |
你不在 `/home/commander` 資料夾裡。
請使用 `cd /home/commander` 來返回 `/home/commander` 資料夾。
response:
content: |
你成功複製 `hello.txt` 到 `hello2.txt` 了!
我們打開來確認一下 `hello2.txt` 的內容吧!
hint: 使用 `cat hello2.txt` 來查看 `hello2.txt` 的內容
- id: cat-hello2
name: 查看 `hello2.txt` 的內容
requirements:
- cp-hello
condition:
pwd: /home/commander
command: cat hello2.txt
output: Hello
exceptions:
- id: wrong_directory
condition:
not:
pwd: /home/commander
response:
content: |
你不在 `/home/commander` 資料夾裡。
請使用 `cd /home/commander` 來返回 `/home/commander` 資料夾。
response:
content: |
你成功查看到 `hello2.txt` 的內容了!
正如我們所見,`hello2.txt` 的內容跟 `hello.txt` 一模一樣。
那我們再來試試看複製 `world.txt` 到 `world2.txt` 吧!
hint: 使用 `cp world.txt world2.txt` 來複製 `world.txt` 到 `world2.txt`
- id: cp-world
name: 複製 `world.txt` 到 `world2.txt`
requirements:
- cat-hello2
condition:
pwd: /home/commander
command: cp world.txt world2.txt
files:
- path: /home/commander/world2.txt
type: file
exists: true
exceptions:
- id: wrong_directory
condition:
not:
pwd: /home/commander
response:
content: |
你不在 `/home/commander` 資料夾裡。
請使用 `cd /home/commander` 來返回 `/home/commander` 資料夾。
response:
content: |
你成功複製 `world.txt` 到 `world2.txt` 了!
我們打開來確認一下 `world2.txt` 的內容吧!
hint: 使用 `cat world2.txt` 來查看 `world2.txt` 的內容
- id: cat-world2
name: 查看 `world2.txt` 的內容
requirements:
- cp-world
condition:
pwd: /home/commander
command: cat world2.txt
output: World
exceptions:
- id: wrong_directory
condition:
not:
pwd: /home/commander
response:
content: |
你不在 `/home/commander` 資料夾裡。
請使用 `cd /home/commander` 來返回 `/home/commander` 資料夾。
response:
content: |
你成功查看到 `world2.txt` 的內容了!
`world2.txt` 的內容跟 `world.txt` 一模一樣。
接下來我們要來學習如何複製資料夾。
現在目錄下有一個 `notes` 資料夾,裡面有一個 `note.txt` 的檔案。
我們要能整個資料夾包含裡面的檔案一起複製到 `notes2`。
跟複製單一檔案不一樣的是,複製資料夾時,我們要加上 `-r` 的選項(recursive)代表將資料夾中的所有檔案都一起複製。
在使用指令時,如果想要調整指令的行為,可以在指令後面加上選項。
選項的格式通常是 `-` 加上一個字母,例如 `-r`。
選項擺放的位置沒有特別的限制,通常會跟在指令的後面,置於檔案名稱的前面。
請你使用 `cp -r notes notes2` 來複製 `notes` 資料夾到 `notes2`。
hint: |
使用 `cp -r notes notes2` 來複製 `notes` 資料夾到 `notes2`
記得要加上 `-r` 的選項來複製所有檔案
- id: cp-notes
name: 複製 `notes` 資料夾到 `notes2`
requirements:
- cat-world2
condition:
pwd: /home/commander
command: cp -r notes notes2
files:
- path: /home/commander/notes2
type: directory
exists: true
- path: /home/commander/notes2/note.txt
type: file
exists: true
exceptions:
- id: wrong_directory
condition:
not:
pwd: /home/commander
response:
content: |
你不在 `/home/commander` 資料夾裡。
請使用 `cd /home/commander` 來返回 `/home/commander` 資料夾。
- id: missing_recursive
condition:
command: cp notes notes2
response:
content: |
你忘記加上 `-r` 的參數了嗎?
請輸入 `cp -r notes notes2` 來複製 `notes` 資料夾到 `notes2`
response:
content: |
你成功複製 `notes` 資料夾到 `notes2` 了!
我們可以看到,整個 `notes` 資料夾包含裡面的檔案,都被複製到 `notes2` 資料夾了。
使用 `cp -r` 複製資料夾,不論資料夾中有多少檔案,多少層目錄,都可以一次複製過去。
那麼最後我們要來試試看,如果複製一個檔案到已經存在的檔案會發生什麼事。
請把 `hello.txt` 複製到 `world.txt` 看看會發生什麼事。
hint: 使用 `cp hello.txt world.txt` 來複製 `hello.txt` 到 `world.txt`
- id: cp-overwrite
name: 複製 `hello.txt` 到 `world.txt`
requirements:
- cp-notes
condition:
pwd: /home/commander
command: cp hello.txt world.txt
exceptions:
- id: wrong_directory
condition:
not:
pwd: /home/commander
response:
content: |
你不在 `/home/commander` 資料夾裡。
請使用 `cd /home/commander` 來返回 `/home/commander` 資料夾。
response:
content: |
你成功複製 `hello.txt` 到 `world.txt` 了!
我們打開來確認一下 `world.txt` 的內容吧!
hint: 使用 `cat world.txt`
- id: check-world
name: 檢查 `world.txt` 的內容
requirements:
- cp-overwrite
condition:
pwd: /home/commander
command: cat world.txt
output: Hello
exceptions:
- id: wrong_directory
condition:
not:
pwd: /home/commander
response:
content: |
你不在 `/home/commander` 資料夾裡。
請使用 `cd /home/commander` 來返回 `/home/commander` 資料夾。
response:
content: |
`world.txt` 的內容變成 `Hello` 了!
這是因為,當我們複製檔案時,如果目的檔案已經存在,那麼目的檔案的內容就會被覆蓋掉。
所以在複製檔案的時候,要特別注意目的檔案是否已經存在,否則可能會不小心把資料弄丟。
以上就是複製檔案的基本操作!
請輸入 `echo finish` 來完成這個關卡。
- id: finish
name: 恭喜你完成了所有任務!
requirements:
- check-world
condition:
command: echo finish
response:
content: |
恭喜你完成了所有任務!
你已經學會了如何複製檔案與資料夾。
在下一個關卡中,你將學習如何移動檔案與資料夾。