1

Я пытаюсь написать скрипт, который будет перебирать все подпапки каталога для поиска определенного файла, а затем копировать новый файл в те папки, которые содержат этот файл.

Это то, что я до сих пор:

#!/bin/sh
dir=/Documents
find "$dir" -name Sample.doc -printf "%p\n" | sort -nr | while read -r i; do
  echo "$i"
  done

Это работает для получения списка всех файлов Sample.doc и их папок в папке « Documents ».

Однако я не могу найти способ извлечь путь из этих папок, чтобы скопировать в них новый файл.

Любая помощь будет оценена.

4 ответа4

0

Использование %h вместо %p уже было предложено в другом ответе, но я хотел бы добавить некоторые улучшения, чтобы сделать ваш код более устойчивым. Если, например, соответствующий каталог содержит символ новой строки в своем имени, в лучшем случае вы потеряете каталоги и получите некоторые сообщения об ошибках от cp. В худшем случае вы можете переопределить файлы в любом месте вашей системы.

Вместо этого попробуйте сделать это так:

find "$dir" -name Sample.doc -printf "%h\0" | xargs --null -L1 cp SomeFile

Ноль ACSII гарантированно никогда не будет отображаться ни в одном имени файла, поэтому, в отличие от \n он работает как надежный разделитель для прохождения путей. --null указывает xargs использовать \0 в качестве разделителя ввода. Затем он выполнит данную команду (cp Somefile) один раз для каждого элемента, прошедшего через канал, добавив соответствующий элемент в качестве дополнительного аргумента.

0

В Баш:

shopt -s nullglob globstar
for i in "$dir"/**/Sample.doc
do
    cp 'new file' "$(dirname "$i")"/
done

В рыбе:

for i in $dir/**Sample.doc
    cp 'new file' (dirname $i)/
end
0

Команда dirname удаляет имя файла из полного пути

0

Я думаю, что ты почти там. Вы можете заменить %p на %h в выражении -printf :

% h: ведущие каталоги имени файла (все, кроме последнего элемента). Если имя файла не содержит косых черт (поскольку оно находится в текущем каталоге), спецификатор% h расширяется до «.».

поэтому команда будет выглядеть примерно так:

find "$dir" -name Sample.doc -printf "%h\n" | sort -nr | while read -r i; do cp SomeFile "$i"; done

кстати, зачем нужна sort ?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .