
テキスト ファイル ( ) に名前のリストがあります。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
作成可能なすべてのディレクトリが作成されるためです。改行をスペースに置き換えることでテキスト ファイルを単純に「平坦化」し、一度に 1 つずつではなく、すべてのディレクトリ名を含む長い引数リストでxargs
呼び出します。mkdir
固定のプレフィックス(またはサフィックス、あるいはその両方)を追加する場合:
xargs -I, mkdir prefix_, <list.txt
スイッチの後に置いたもの-I
(この場合はカンマ) は、ファイルから読み取られた名前に置き換えられます。
もう 1 つ、テキスト ファイル内のファイル名にスペースやその他の「特殊」文字が含まれている場合に備えて、引用符を追加します。
xargs -I, mkdir "," <list.txt
または
xargs -I, mkdir "prefix_," <list.txt
答え2
あなたの例では、シェル スクリプト コマンドがわかりにくいです。どのスクリプト言語を使用しているかに特に注意し、そのコマンドの構文に従う必要があります。あなたの例では、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 がディストリビューションにパッケージ化されていない場合は、ルート アクセスを必要としない個人用インストールを行うことができます。次の操作を実行すると、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`