Bash脚本根据父目录重命名文件

时间:2019-02-22 14:18:19

标签: bash

这是一个片段,旨在查找文件,并根据其父目录的名称对其进行重命名。

我正在尝试使此脚本递归工作,但是使用了从其启动目录,而不是结果的位置(即使使用了execdir)。

find . -name "*.txt" -exec -execdir mv {} ${PWD##*/}.txt \;

是否可以修改${PWD##*/}位以确认execdir命令并从文件位置目录中执行操作?

1 个答案:

答案 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;

我不知道这是否可以解决您的问题,但我想这是总的方向。