Баш М.В. это не каталог - PullRequest
1 голос
/ 16 марта 2012

У меня есть это:

$ 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_

И хочу переместить х_ на х, я пытаюсь это:

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

Что я получаю:

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

Ответы [ 3 ]

1 голос
/ 16 марта 2012

Я хотел бы использовать:

(cd a; for file in *_; do mv "$file" "${file%_}"; done)
1 голос
/ 16 марта 2012

Лучше использовать prename;)

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

Зависит от вашего дистрибутива, иногда называемого просто переименованием. Иногда есть один в формате ELF, но требуется perl, вы можете проверить это следующим образом: file $(readlink -f $(type -p rename))

0 голосов
/ 16 марта 2012
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 существует и является файлом, перезаписать.

...