ディレクトリリストの作成

ディレクトリリストの作成

テキストファイル()に名前リストがあり、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一度に1つずつ、代わりにすべてのディレクトリ名を含む長い引数のリストを呼び出すことができます。

固定プレフィックス(またはサフィックス、またはその両方)を追加する場合:

xargs -I, mkdir prefix_, <list.txt

スイッチの後に入力された内容(この場合はカンマ)は、ファイル-Iから読み取られた名前に置き換えられます。

もう1つのことは、テキストファイルのファイル名にスペースやその他の「特殊」文字が含まれている場合は引用符を追加することです。

xargs -I, mkdir "," <list.txt

または

xargs -I, mkdir "prefix_," <list.txt

答え2

あなたの例では、シェルスクリプトコマンドは混乱しています。使用するスクリプト言語に特別な注意を払って、そのコマンドの構文に従う必要があります。あなたの例ではTurbo Cシェル(tcsh)を使用していますが、Bash / Bourneシェルコマンドと構文を混在させます。

本当に必要な場合は、次の方法を使用できます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`

関連情報