Dir1、Dir2、Dir3、Dir4、Dir5という5つのディレクトリがあります。各ディレクトリには、データを含む5つのテキストファイル(file1.txt、file2.tx、.file5.txtという名前)があります。私が望むのは、5つのディレクトリすべてからfile1.txtをコピーして、別のディレクトリ(Joint_Dirという名前)に順次追加することです。 file2.txt、file3.txt...file5.txtに対しても同じことを行います。
答え1
あなたはこれを行うことができますワイルドカードパターン/ワイルドカード。たとえば、次のコマンドはfile1.txt
ディレクトリ内のすべてのファイルを単一のファイルにリンクしますJoint_Dir
。
cat Dir[1-5]/file1.txt > Joint_Dir/file1.txt
ただし、パターンマッチングを使用してこのようなコマンドを実行する前に、いくつかの完全性チェックコマンドを実行して、どのファイルが影響を受けるかを確認してください。この場合、以下を使用してパターンがDir[1-5]/file1.txt
予想されるファイルと一致することを確認できますls
。
ls -ld Dir[1-5]/file1.txt
別のオプションは、次のものを使用することです。支柱の拡張。中かっこ拡張を使用して前の例を再構築すると、次のような結果が生成されます。
cat Dir{1..5}/file1.txt > Joint_Dir/file1.txt
支柱の拡張はいわゆる言うことです。バシズムそして他のシェルでは機能しないかもしれません。この区別は他の場所で議論された。中かっこ拡張がスクリプトで機能しない。記事で説明されているように、他の選択肢には、seq
コマンドを使用するか、whileループ内で変数を増やすことが含まれます。
ループについては、単一のコマンドですべての接続を実行するためにforループを使用できます。たとえば、次のようになります。
for i in $(seq 1 5); do
cat Dir[1-5]/file${i}.txt > Joint_Dir/file${i}.txt
done
以下は、上記の技術を使用する方法のスタンドアロンの例です。次のコマンドをそのまま実行できる必要があります。まず、元の質問に記載されている内容をミラーリングしてテストファイルを含むディレクトリを設定するスクリプトを次に示します。
#!/bin/bash
# create-test-files.sh
# Create test files and directories
for i in $(seq 1 5); do
mkdir -p "/tmp/test/Dir${i}"
for j in $(seq 1 5); do
echo "File ${j} in directory ${i}" > "/tmp/test/Dir${i}/file${j}.txt"
done
done
このスクリプトを実行した後、作成した内容を確認できます。
$ bash create-test-files.sh
$ tree /tmp/test/
/tmp/test/
|-- Dir1
| |-- file1.txt
| |-- file2.txt
| |-- file3.txt
| |-- file4.txt
| `-- file5.txt
|-- Dir2
| |-- file1.txt
| |-- file2.txt
| |-- file3.txt
| |-- file4.txt
| `-- file5.txt
|-- Dir3
| |-- file1.txt
| |-- file2.txt
| |-- file3.txt
| |-- file4.txt
| `-- file5.txt
|-- Dir4
| |-- file1.txt
| |-- file2.txt
| |-- file3.txt
| |-- file4.txt
| `-- file5.txt
`-- Dir5
|-- file1.txt
|-- file2.txt
|-- file3.txt
|-- file4.txt
`-- file5.txt
5 directories, 25 files
ファイルの内容を調べることもできます。
$ cat /tmp/test/Dir[1-5]/file1.txt
File 1 in directory 1
File 1 in directory 2
File 1 in directory 3
File 1 in directory 4
File 1 in directory 5
$ cat /tmp/test/Dir1/file[1-5].txt
File 1 in directory 1
File 2 in directory 1
File 3 in directory 1
File 4 in directory 1
File 5 in directory 1
次に、次のスクリプトを生成してファイルをリンクできます。
#!/bin/bash
# concatenate-test-files.sh
# Create output directory
mkdir -p /tmp/test/Joint_Dir
# Concatenate identically-named files from different directories
for i in $(seq 1 5); do
cat "/tmp/test/Dir"[1-5]"/file${i}.txt" > "/tmp/test/Joint_Dir/file${i}.txt"
done
このスクリプトを実行した後、出力ディレクトリの内容を確認できます。
$ bash concatenate-test-files.sh
$ ls -1 /tmp/test/Joint_Dir/
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
$ cat /tmp/test/Joint_Dir/file1.txt
File 1 in directory 1
File 1 in directory 2
File 1 in directory 3
File 1 in directory 4
File 1 in directory 5
実験が完了したら、テストディレクトリを削除できます。
rm -rf /tmp/test