Используйте команду find, но исключайте файлы в двух каталогах
Я хочу найти файлы, заканчивающиеся на _peaks.bed
, но исключающие файлы в папки tmp
и scripts
.
Моя команда такова:
find . -type f \( -name "*_peaks.bed" ! -name "*tmp*" ! -name "*scripts*" \)
Но это не сработало. Файлы в папках tmp
и script
будут отображаться.
Есть ли у кого-нибудь идеи об этом?
Ответы
Ответ 1
Здесь вы можете указать, что с помощью find
:
find . -type f -name "*_peaks.bed" ! -path "./tmp/*" ! -path "./scripts/*"
Объяснение:
-
find .
- Начать поиск из текущего рабочего каталога (рекурсивно по умолчанию)
-
-type f
- укажите find
, что вам нужны только файлы в результатах
-
-name "*_peaks.bed"
- Ищите файлы с именем, заканчивающимся на _peaks.bed
-
! -path "./tmp/*"
- Исключить все результаты, путь которых начинается с ./tmp/
-
! -path "./scripts/*"
- также исключить все результаты, путь которых начинается с ./scripts/
Тестирование решения:
$ mkdir a b c d e
$ touch a/1 b/2 c/3 d/4 e/5 e/a e/b
$ find . -type f ! -path "./a/*" ! -path "./b/*"
./d/4
./c/3
./e/a
./e/b
./e/5
Вы были довольно близки, опция -name
учитывает только базовое имя, где -path
рассматривает весь путь =)
Ответ 2
Вот один из способов сделать это...
find . -type f -name "*_peaks.bed" | egrep -v "^(./tmp/|./scripts/)"
Ответ 3
Попробуйте что-нибудь вроде
find . \( -type f -name \*_peaks.bed -print \) -or \( -type d -and \( -name tmp -or -name scripts \) -and -prune \)
и не удивляйтесь, если я немного ошибаюсь. Если целью является exec (вместо печати), просто замените его на месте.
Ответ 4
для меня это решение не работало над командой exec с find, не знаю почему, поэтому мое решение
find . -type f -path "./a/*" -prune -o -path "./b/*" -prune -o -exec gzip -f -v {} \;
Объяснение: то же, что и sampson-chen с дополнениями
-prune - игнорировать путь обработки...
-o - Тогда, если совпадение не распечатывает результаты, (обрезайте каталоги и распечатайте оставшиеся результаты)
18:12 $ mkdir a b c d e
18:13 $ touch a/1 b/2 c/3 d/4 e/5 e/a e/b
18:13 $ find . -type f -path "./a/*" -prune -o -path "./b/*" -prune -o -exec gzip -f -v {} \;
gzip: . is a directory -- ignored
gzip: ./a is a directory -- ignored
gzip: ./b is a directory -- ignored
gzip: ./c is a directory -- ignored
./c/3: 0.0% -- replaced with ./c/3.gz
gzip: ./d is a directory -- ignored
./d/4: 0.0% -- replaced with ./d/4.gz
gzip: ./e is a directory -- ignored
./e/5: 0.0% -- replaced with ./e/5.gz
./e/a: 0.0% -- replaced with ./e/a.gz
./e/b: 0.0% -- replaced with ./e/b.gz
Ответ 5
Вы можете попробовать:
find ./ ! \( -path ./tmp -prune \) ! \( -path ./scripts -prune \) -type f -name '*_peaks.bed'