![递归到子目录中,并将所有文件的名称作为其所在目录的前缀](https://linux22.com/image/723422/%E9%80%92%E5%BD%92%E5%88%B0%E5%AD%90%E7%9B%AE%E5%BD%95%E4%B8%AD%EF%BC%8C%E5%B9%B6%E5%B0%86%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E7%9A%84%E5%90%8D%E7%A7%B0%E4%BD%9C%E4%B8%BA%E5%85%B6%E6%89%80%E5%9C%A8%E7%9B%AE%E5%BD%95%E7%9A%84%E5%89%8D%E7%BC%80.png)
我在子目录 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 解释了这个命令这里