Назад | Перейти на главную страницу

Рекурсия по подкаталогам и префикс всех файлов с именем их каталога хранения

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

 #!/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