команда "find", но она перестает углубляться, если находит каталог, начинающийся с "." - PullRequest
0 голосов
/ 24 февраля 2020

Я должен сделать скрипт, который проходит через всю папку (/home, в моем случае).

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

Для первой части мы используем команду

for path in $(find /home \! -name ".*");do

где path - переменная, содержащая путь. Но мы не знаем, как выполнить часть каталога.

Я думал, что проложу путь через /, а затем посмотрю, есть ли .. В этом случае есть if, который не сохраняет файл, но я не знаю, как вырезать строку и сохранить ее в переменной, а затем go через нее.

Ответы [ 3 ]

1 голос
/ 24 февраля 2020

Вы можете обрезать все файлы, начинающиеся с ..

Со справочной страницы GNU find:

-prune True; если файл является каталогом, не спускайтесь в него. Если задано -depth, false; нет эффекта. Поскольку -delete подразумевает -depth, вы не можете использовать вместе -prune и -delete.

Вы не должны l oop сверх результата из find. Вы получите неожиданные результаты, если у вас есть имена файлов с пробелами или переводами строки. Используйте xargs или -exec, например

find /home -path "*/.*" -prune -o -print0 | xargs -0I{} sh -c 'echo "doing something with $1"' sh {}

или

find /home -path "*/.*" -prune -o -exec sh -c 'for i; do echo "doing something with $i"; done' sh {} +

Часть -prune удаляет все имена файлов (файлы и каталоги), начиная с точки, и не убывает в каталоги, начинающиеся с точки. Все остальные имена файлов печатаются с символом NUL вместо новой строки (-o -print0) и передаются в xargs или сценарий оболочки выполняется с вашим действием (как можно меньше раз).

Чтобы сохранить все имена файлов в файл:

find /home -path "*/.*" -prune -o -print > allfiles.txt
0 голосов
/ 24 февраля 2020

Попробуйте это

for path in $(find /home -type d -name ".*" -prune -o -type f \! -name ".*" -print);do echo $path; done
0 голосов
/ 24 февраля 2020

Думаю, я бы сделал что-то подобное:

for path in $(find . -type f | egrep -v '/\.[^\/]+\/'); do
...

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

...