这是一个片段,旨在查找文件,并根据其父目录的名称对其进行重命名。
我正在尝试使此脚本递归工作,但是使用了从其启动目录,而不是结果的位置(即使使用了execdir)。
find . -name "*.txt" -exec -execdir mv {} ${PWD##*/}.txt \;
是否可以修改${PWD##*/}
位以确认execdir命令并从文件位置目录中执行操作?
答案 0 :(得分:0)
这是我的尝试,请注意,如果文件夹中有空格,反斜杠或文件名,则无法使用此功能。
#!/bin/bash
arr=($(echo "$(find . -type d)"))
for dir in ${arr[@]}; do
files=($dir/*);
dirname=$(basename $dir);
echo $dirname; # For testing
for f in ${files[@]}; do
if [ -f $f ]; then
fbase=$(basename $f)
fbase="$dirname""_""$fbase"
echo "mv $f $dir/$fbase;" # For testing
mv $f $dir/$fbase; # For real.
fi
done
done
这是标准输出的输出:
B
mv ./B/file1 ./B/B_file1;
mv ./B/file2 ./B/B_file2;
mv ./B/file3 ./B/B_file3;
mv ./B/file4 ./B/B_file4;
mv ./B/file5 ./B/B_file5;
mv ./B/file6 ./B/B_file6;
A
mv ./A/file1 ./A/A_file1;
mv ./A/file2 ./A/A_file2;
mv ./A/file3 ./A/A_file3;
mv ./A/file4 ./A/A_file4;
mv ./A/file5 ./A/A_file5;
mv ./A/file6 ./A/A_file6;
C
mv ./A/C/file1 ./A/C/C_file1;
mv ./A/C/file2 ./A/C/C_file2;
mv ./A/C/file3 ./A/C/C_file3;
mv ./A/C/file4 ./A/C/C_file4;
mv ./A/C/file5 ./A/C/C_file5;
mv ./A/C/file6 ./A/C/C_file6;
我不知道这是否可以解决您的问题,但我想这是总的方向。