
2つの別々のループがあるとします
for file1 in `ls Dir1/` ; do
echo $file1
done
for file2 in `ls Dir2/` ; do
echo $file2
done
両方のディレクトリ疑似コードを単一のループで繰り返したい
for file1 , file2 in `ls Dir1` , `ls Dir2`
do
echo $file1
echo file2
done
出来ますか
答え1
while
ファイル名に改行文字が含まれていないと仮定すると、適切な入力を持つループで目的を達成できます。
paste -d/ <(ls /var) <(ls /usr) |
while IFS=/ read -r e u; do
printf '%s\n' "$e $u"
done
答え2
shopt -s nullglob
dir1names=( Dir1/* )
dir2names=( Dir2/* )
while [ "${#dir1names[@]}" -gt 0 ] &&
[ "${#dir2names[@]}" -gt 0 ]
do
printf '%s\n' "${dir1names[0]##*/}"
printf '%s\n' "${dir2names[0]##*/}"
dir1names=( "${dir1names[@]:1}" )
dir2names=( "${dir2names[@]:1}" )
done
これは、bash
各ディレクトリからすべてのパス名を 2 つの配列に取得するために使用します。次に、これらのパス名のファイル名部分を ( と同様にls
) 配列間で交互に印刷し、印刷されたエントリを配列から削除します。配列の 1 つが完全に空になると停止します。
シェルnullglob
オプションは、一致しないグロブ パターンを展開せずにそのままにしておくのではなく、何も展開しないようにします。
テスト:
$ tree
.
|-- Dir1
| |-- file-1
| |-- file-2
| |-- file-3
| `-- file-4
|-- Dir2
| |-- otherfile-1
| |-- otherfile-2
| |-- otherfile-3
| |-- otherfile-4
| |-- otherfile-5
| `-- otherfile-6
`-- script.sh
2 directories, 11 files
$ bash script.sh
file-1
otherfile-1
file-2
otherfile-2
file-3
otherfile-3
file-4
otherfile-4
もしこれが実はファイルを名前に従ってペアリングすることについて、つまり、あるディレクトリのファイルが別のディレクトリの対応するファイルとペアになる(バイオインフォマティクスアプリケーションなどで時々行われるようです)場合は、セットの1つを反復処理して、建設する他のセットの対応するファイルの名前。
ファイルがsomething_R1_more
と呼ばれ、 が特定のファイルのペアを識別していると仮定something_R2_more
します。something
more
R1
R2
for r1 in dir1/*_R1_*; do
r2=${r1##*/} # dir1/something_R1_more --> something_R1_more
r2=dir2/${r2/_R1_/_R2_} # something_R1_more --> dir2/something_R2_more
if [ ! -f "$r2" ]; then
printf '%s not found\n' "$r2" >&2
exit 1
fi
# process "$r1" and "$r2" here
done
答え3
あなたは一般的に出力を解析したくないls
。
ここでは、zsh
(変数を引用符で囲んでおらず、グロブを無効にせずにコマンド置換を使用しているのでzsh
はなく、既に構文を使用してbash
いるため)、次のように実行できます。
dir1_file_names=(dir1/*(N:t))
dir2_file_names=(dir2/*(N:t))
for f1 f2 (${dir1_file_names:^dir2_file_names})
printf '%s\n' "f1: $f1, f2: $f2"
zsh
複数の変数をループすることができます${a:^b}
。配列の圧縮演算子。配列の 1 つに他の配列よりも少ない要素がある場合、最小の長さに切り捨てられたかのようになります。
2 つのディレクトリ内のファイル名を比較する場合は、配列の交差演算子と減算演算子も参照してください。
file_names_in_both_dir1_and_dir2=(${dir1_file_names:*dir2_file_names})
file_names_only_in_dir1=(${dir1_file_name:|dir2_file_names})
file_names_only_in_dir2=(${dir2_file_name:|dir1_file_names})
答え4
複数の変数の出力は、以下に示すように単一の変数に保存できます。それが機能するかどうかを確認してください。
#!/bin/bash
cd /
for file1 in $(ls /usr/ ; echo "::::::NEXT:::::::" ; ls /sys/)
do
echo $file1
done