Исключение файла из UNIX "найти" результаты, основанные на существовании другого файла

268
aendrew

У меня есть большая куча каталогов, каждая из которых содержит серию файлов .pdf. Некоторые из этих файлов успешно преобразованы в .csv, некоторые нет. Пример списка каталогов с использованием find ./:

./test5.pdf.csv ./test6.pdf ./test1.pdf.csv ./test3.pdf ./test1.pdf ./test3.pdf.csv ./test4.pdf.csv ./test7.pdf ./test2.pdf ./test5.pdf ./test4.pdf ./test2.pdf.csv ./test8.pdf 

Как бы я вернул список файлов, которые не были успешно конвертированы?

Другими словами, какие файлы не имеют аналога .csv.pdf?

В этом примере это будет тест .pdf.

1

2 ответа на вопрос

5
cxcv

Вот как это работает с find:

find . -name "*.pdf" | while read F; do test -f "$.csv" || echo "$F"; done 

Использование find предпочтительнее, чем использование globbing в оболочке, поскольку оно не ограничивает количество аргументов и работает с пробелами и специальными символами.

Рад, это полностью то, что я искал. Только что проверил, отлично работает! aendrew 10 лет назад 0
3
GnP

I couldn't find a way to do it with find directly, but it's very easy using a for loop:

for file in *.pdf; do [ -f $.csv ] || echo $file; done 

If you need to run it at the top directory and have it recurse, you could use find like this:

for file in $(find . -iname '*.pdf'); do [ -f $.csv ] || echo $file; done 

which would output something like this:

./dir2/test7.pdf ./dir2/test6.pdf ./dir2/test8.pdf ./dir3/test7.pdf ./dir3/test6.pdf ./dir3/test8.pdf ./dir1/test7.pdf ./dir1/test6.pdf ./dir1/test8.pdf 

Careful with that last one though, if you aren't sure there won't be any strange characters in the input filenames, make sure you set IFS environment variable accodingly:

OFS=$IFS export IFS=$'\n' 

Of course, from here on it only gets nastier.

I'm assuming you use bash.

Это отличный, подробный ответ, если у вас есть менее чем звездная версия `find` (я думаю, что в Solaris это немного отличается) или вам не нравится` find` - я принял другой ответ, потому что он ближе к мой первоначальный вопрос, но этот тоже довольно потрясающий. Хотел бы я принять оба! aendrew 10 лет назад 0