Почему я получаю ошибки 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
возможность обрабатывать записи в каталоге в первую очередь, а сам каталог в качестве последнего шага.