У меня есть файлы следующим образом в папке:
Peter_XY.tgz Tom_GF.tgz Harry_AB.tgz
который я пытаюсь поместить в разные папки на основе двух текстовых файлов, которые выглядят следующим образом:
A.txt
AB1
AB
XY
SE
12S
G78
B.txt
OR1
IU345
PIE678
GF
BF
MIL
Я пытаюсь поместить файлы в две разные папки:
A
Peter_XY.tgz Harry_AB.tgz
B
Tom_GF.tgz
Теперь на основе кода, предложенного здесь: Переместите файлы из одного каталога в другой на основе имен файлов в формате csv с помощью терминала macOS
Я изменил код следующим образом:
for file in $(cat A.txt); do mv $file A; done
for file in $(cat B.txt); do mv $file B; done
Как убедиться, что код читается только после знака «_»?
Следующий скрипт будет искать все файлы с именем, оканчивающимся на .txt
, в переменной txtFile
во внешнем цикле for, поэтому A.txt
и B.txt
будут отдельными циклами во внешнем цикле.
Внутренний цикл for использует предоставленный вами код для получения символов после _
, но перед .tgz
. Переменная seek
.
basename
с расширением .txt
переменной txtFile
используется в качестве целевого каталога. Переменная DEST
, поэтому A.txt
становится A
.
Наконец, любой найденный файл, соответствующий имени файла из одного из текстовых файлов, перемещается в каталог назначения. Другими словами, mv
(переместить) *_${seek}.tgz
(любой файл, оканчивающийся на _
seek
.tgz
) в $DEST
.
for txtFile in *.txt ; do
DEST=$(basename $txtFile .txt);
echo "processing $txtFile by moving matches to $DEST";
for seek in $(cat $txtFile) ; do
echo "Moving files matching *_${seek}.tgz to $DEST";
mv *_${seek}.tgz $DEST;
done;
done
Вот вывод с учетом файлов, которые вы указали выше:
processing A.txt by moving matches to A
Moving files matching *_AB1.tgz to A
mv: rename *_AB1.tgz to A/*_AB1.tgz: No such file or directory
Moving files matching *_AB.tgz to A
Moving files matching *_XY.tgz to A
Moving files matching *_SE.tgz to A
mv: rename *_SE.tgz to A/*_SE.tgz: No such file or directory
Moving files matching *_12S.tgz to A
mv: rename *_12S.tgz to A/*_12S.tgz: No such file or directory
Moving files matching *_G78.tgz to A
mv: rename *_G78.tgz to A/*_G78.tgz: No such file or directory
processing B.txt by moving matches to B
Moving files matching *_OR1.tgz to B
mv: rename *_OR1.tgz to B/*_OR1.tgz: No such file or directory
Moving files matching *_IU345.tgz to B
mv: rename *_IU345.tgz to B/*_IU345.tgz: No such file or directory
Moving files matching *_PIE678.tgz to B
mv: rename *_PIE678.tgz to B/*_PIE678.tgz: No such file or directory
Moving files matching *_GF.tgz to B
Moving files matching *_BF.tgz to B
mv: rename *_BF.tgz to B/*_BF.tgz: No such file or directory
Moving files matching *_MIL.tgz to B
mv: rename *_MIL.tgz to B/*_MIL.tgz: No such file or directory
И результаты такие:
├── A
│ ├── Harry_AB.tgz
│ └── Peter_XY.tgz
├── A.txt
├── B
│ └── Tom_GF.tgz
├── B.txt