
我在文字檔案 ( list.txt
) 中有一個名稱列表,我想為該文件中包含的名稱建立一個資料夾列表。我寫了以下腳本,但它不起作用,我不知道出了什麼問題:
#!/bin/tcsh
for name_id in `cat <path to list.txt>/list.txt` ; do
mkdir <name_id>${name_id}
該文件list.txt
和腳本位於同一資料夾中。
答案1
這對我有用:
xargs mkdir <list.txt
這是有效的,因為如果你給它多個參數,mkdir
它會很高興地創建它可以創建的所有目錄。xargs
只需透過用空格替換換行符來“展平”文字文件,從而mkdir
一次調用包含所有目錄名稱的一長串參數,而不是一次調用一個。
如果要加上固定前綴(或後綴,或兩者):
xargs -I, mkdir prefix_, <list.txt
開關(在本例中為逗號)後面輸入的任何內容-I
都會替換為從檔案讀取的名稱。
另一件事,我會添加引號,以防文字檔案中的檔案名稱中包含空格或其他“特殊”字元:
xargs -I, mkdir "," <list.txt
或者
xargs -I, mkdir "prefix_," <list.txt
答案2
在您的範例中,您令人困惑的 shell 腳本命令。您必須特別注意您使用的腳本語言,然後遵守其命令的語法。在您的範例中,您使用 Turbo C shell (tcsh),但是您隨後混合了 Bash/Bourne shell 命令和語法。
如果您確實需要,可以使用以下方法tcsh
。假設我有這個範例檔:
$ cat afile
1
2
3
4
5
這個腳本:
$ cat cmd.csh
#!/bin/tcsh
foreach i (`cat afile`)
echo "$i"
end
運行它會產生以下輸出:
$ ./cmd.csh
1
2
3
4
5
因此,為了完成任務,我們可以在mkdir
命令後面加上echo
:
$ cat cmd1.csh
#!/bin/tcsh
foreach i (`cat afile`)
echo "making directory: $i"
mkdir "$i"
end
現在當我們運行它時:
$ ./cmd1.csh
making directory: 1
making directory: 2
making directory: 3
making directory: 4
making directory: 5
導致目錄被建立:
$ ls -l
total 32
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 1
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 2
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 3
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 4
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 5
-rw-rw-r--. 1 saml saml 11 Oct 16 18:47 afile
-rwxrwxr-x. 1 saml saml 86 Oct 16 18:56 cmd1.csh
-rwxrwxr-x. 1 saml saml 55 Oct 16 18:51 cmd.csh
答案3
如果您有 GNU Parallel,您可以執行以下操作:
parallel -q mkdir '<name_id>'{} < list.txt
與 xargs 相反,它可以正確處理特殊字元 - 例如 <、>、'、" 和空格。
GNU Parallel 是一個通用並行器,可以輕鬆地在同一台電腦或多台您可以透過 ssh 存取的電腦上並行運行作業。
安裝
如果您的發行版未打包 GNU Parallel,您可以進行個人安裝,不需要 root 存取權。這樣做可以在 10 秒內完成:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
其他安裝選項,請參閱http://git.savannah.gnu.org/cgit/parallel.git/tree/README
了解更多
查看更多範例:http://www.gnu.org/software/parallel/man.html
觀看介紹影片:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
瀏覽本教學:http://www.gnu.org/software/parallel/parallel_tutorial.html
註冊電子郵件清單以獲得支援:https://lists.gnu.org/mailman/listinfo/parallel
答案4
你不需要循環。你可以做:
mkdir `sed 's/^/<name_id>/' <path to list.txt>/list.txt`