我在子目录 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 解释了这个命令这里