Перейдите в подкаталоги и добавьте к файлам префикс с именем его каталога хранения.

У меня есть файлы в подкаталогах 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 объяснил здесь эту команду

Другие вопросы по тегам