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
для получения всех путей из каждого каталога в два массива. Затем он печатает часть имени файла этих путей (, как ls
сделал бы ), чередуя массивы, и удаляет напечатанные целые массивы. Он останавливается, когда один из массивов полностью пуст.
Параметр оболочки 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
Если речь идет на самом деле о объединении файлов в пары в соответствии с их именами, так что файл в одном каталоге соединяется с соответствующим файлом в другом (, как это иногда делается, например.приложений биоинформатики, кажется ), тогда вам лучше просто перебирать один из наборов, а затем конструировать имена соответствующих файлов из другого набора.
Предположим, что файлы называются 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