ディレクトリのリストを作成する

ディレクトリのリストを作成する

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

関連情報