Почему я получаю ошибки mv с этой командой sed?

Учитывая следующий каталог:

[~/test]find .
.
./something_else.txt
./univision.rbw
./something_else.rb
./testtest
./testtest/weewee.rb
./testtest/weewee.txt
./univision.rb

Выполнение следующей команды sed генерирует много mv ошибки:

[~/test]for i in $( find . ); do mv $i `echo $i | sed  s/test/this_is_not_a_test/g`; done; 
mv: ‘.’ and ‘./.’ are the same file
mv: ‘./something_else.txt’ and ‘./something_else.txt’ are the same file
mv: ‘./univision.rbw’ and ‘./univision.rbw’ are the same file
mv: ‘./something_else.rb’ and ‘./something_else.rb’ are the same file
mv: cannot stat ‘./testtest/weewee.rb’: No such file or directory
mv: cannot stat ‘./testtest/weewee.txt’: No such file or directory
mv: ‘./univision.rb’ and ‘./univision.rb’ are the same file

но это также "работает"

[~/test]find .
.
./something_else.txt
./univision.rbw
./something_else.rb
./this_is_not_a_testthis_is_not_a_test
./this_is_not_a_testthis_is_not_a_test/weewee.rb
./this_is_not_a_testthis_is_not_a_test/weewee.txt
./univision.rb

Что мне здесь не хватает?

2 ответа

Если имя файла не содержит testВы перемещаете это по себе (как в mv . ./.). Выдает ошибку, но ничего не меняет. Файлы с test в их названиях переименованы правильно.

Вы сначала переименуете каталог ./testtest в ./this_is_not_a_testthis_is_not_a_test, а затем дополнительно пытается переименовать, например, ./testtest/weewee.rb потерпит неудачу, потому что этого файла больше нет. Вы должны использовать найти -depth возможность обрабатывать записи в каталоге в первую очередь, а сам каталог в качестве последнего шага.

Другие вопросы по тегам