bash mv不是目录

时间:2012-03-16 01:31:42

标签: bash recursion move

我有这个:

$ ls a
0  1  1_  2  2_  3  3_  4  4_  5  5_  6  6_  7  7_  8  8_  9  9_  a  a_  b  b_  c  c_ 
d  d_  e  e_  f  f_

想要将x_移动到x,我正在尝试这个:

find a/*_ -type f -exec sh -c 'mv echo "$1" echo "$1" | sed \'\$s/.$//'' sh {} \;

我得到的是:

mv: target `a/x_' is not a directory

3 个答案:

答案 0 :(得分:1)

更好地使用prename;)

prename 's/.$//' a/*_

取决于您的发行版,有时称为重命名。有时会有一个ELF格式,但perl是必需的,你可以这样测试:file $(readlink -f $(type -p rename))

答案 1 :(得分:1)

我很想使用:

(cd a; for file in *_; do mv "$file" "${file%_}"; done)

答案 2 :(得分:0)

for f in {1..9}; do test -e $f_ && mv ${f}_ $f ; done
for f in {a..d}; do test -e $f_ && mv ${f}_ $f ; done 

可以使测试更精细,以检查$ f_是否是test -f $f_的文件,我可以提供测试以确保$ f存在并且是一个目录:

for f in {1..9} {a..d}
do 
    test -f $f_ && test -d $f && mv ${f}_ $f
done

如果没有目录$ f,上面的命令会将$ f_重命名为$ f,如果$ f存在,并且是一个文件,则覆盖。