Перейдите в подкаталоги и добавьте к файлам префикс с именем его каталога хранения.
У меня есть файлы в подкаталогах A, B, C. В каждом каталоге есть файлы с разными именами, скажем, 1.txt 2.txt 3.txt в каждом, хотя имена не имеют отношения как таковые. Я хочу запустить сценарий оболочки bash для повторения каждого из них, чтобы файлы в каждом имели префикс с именами каталога хранения, поэтому в этом примере они переименованы в A_1.txt, A_2.txt A_3.txt B_1.txt и т. Д.
У меня сейчас
#!/bin/bash
for d in ./*/ ;
do cd "$d" ;
for f in "$arg" ;
do echo mv "$f" "${PWD##*/}""_""${f/_*_/_}";
done
done
но это терпит неудачу, и я не могу понять, почему. Благодарен за понимание.
Эта версия работает для отдельных именованных файлов с аргументом, передаваемым сценарию оболочки, но, конечно, не имеет рекурсии в подкаталогах, хотя я могу использовать ее с командой apply для массовой обработки файлов.
#!/bin/bash
for f in "$1" ;
do mv "$f" "${PWD##*/}""_""${f/_*_/_}";
done
2 ответа
#!/bin/bash
for i in $(ls); do # runs through the 'items' in this dir
if [ -d $i ]; then # if this is a dir
fname=${i##*/} # pick up the dir name which will be used as prefix
echo $fname
cd $i # move into the dir
for z in *; do # loop over files
echo $z
mv $z ${fname}_${z} # put the prefix to the file.
done
cd ..
fi
done
find . -type f -exec sh -c 'for f do x=${f#./}; echo mv "$x" "${x////_}"; done' {} +
Повторно запустите команду без эха, чтобы фактически переименовать/переместить файлы.
@nohillside объяснил здесь эту команду