テキストファイル()に名前リストがあり、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`