递归到子目录中,并将所有文件的名称作为其所在目录的前缀

递归到子目录中,并将所有文件的名称作为其所在目录的前缀

我在子目录 A、B、C 中都有文件,每个目录都有各种名称的文件,比如每个目录中有 1.txt 2.txt 3.txt,尽管这些名称本身并不相关。我想运行一个 bash shell 脚本来递归到每个目录中,以便每个目录中的文件都以保存目录的名称作为前缀,因此在此示例中,它们被重命名为 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

但这失败了,我不知道为什么。感谢您的见解。

此版本适用于将参数传递给 shell 脚本的单个命名文件,但当然没有递归到子目录,尽管我可以将它与 apply 命令一起使用以进行批量文件处理。


#!/bin/bash                                                                                                                                                                 
for f in "$1" ;
do  mv "$f" "${PWD##*/}""_""${f/_*_/_}";
done

答案1

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

答案2

find . -type f -exec sh -c 'for f do x=${f#./}; echo mv "$x" "${x////_}"; done' {} +

重新运行不带回显的命令来实际重命名/移动文件。

@nohillside 解释了这个命令这里

相关内容