2013-11-18 3 views
2

Я хотел бы заменить часть каждого пути к файлу, который будет найден, найдя команду linux. Мой подход прилагается ниже:Замена части пути к файлу в exec

find . -type f -name "*.txt" -exec echo {} | sed "s/f/u/g" {} \; 

Я ожидаю, что замена каждой буквы «F» с «и» в файле пути. К сожалению, я получил эту ошибку:

find: missing argument to `-exec' 
sed: can't read {}: No such file or directory 
sed: can't read ;: No such file or directory 

Что я сделал не так? Спасибо за помощь.

+0

'-exec' принимает одно имя команды, а не произвольную команду оболочки. – chepner

ответ

4

Вам не нужно echo {} |

Используйте команды поиска, как это:

find . -type f -name "*.txt" -exec sed "s/f/u/g" '{}' \; 

I would like to replace the part of each file path

Если вы хотите изменить только имена файлов/пути, то используйте:

find . -type f -name "*.txt"-exec bash -c 'echo "$1" | sed "s/f/u/g"' - {} \; 
+0

Ваши последние решения работают отлично. Спасибо. Мое дело было только примером. На самом деле мне нужно заменить начало пути файла (./) на «../directory» и скопировать каждый файл в такую ​​модифицированную структуру каталогов. Основываясь на вашем скрипте, я создал что-то вроде этого: find. -type f -name "* .txt" -exec bash -c 'echo "$ 1" | sed "s /\.\//..\/ directory \ // g" '- {} \; Теперь я пытаюсь добавить функциональность cp. В любом случае, спасибо за вашу помощь – Viper

+0

Добро пожаловать. В моем втором примере с использованием 'bash -c' вы можете добавить больше команд оболочки, чтобы заставить его работать. – anubhava

1
find . -type f -name "*.txt" | while read files 
do 
newname=$(echo "${files}" | sed s"@[email protected]@"g) 
mv -v "${files}" "${newname}" 
done 

Я не c ompletely понять, что вы имели в виду по пути к файлу. Если вы не говорили о имени файла, просим пояснить далее.

+0

'@' является общей частью имени dir в Synology. Я бы выбрал '#' как разделитель – quizac

Смежные вопросы