建立目錄列表

建立目錄列表

我在文字檔案 ( 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`

相關內容