Исключение файла из UNIX "найти" результаты, основанные на существовании другого файла
У меня есть большая куча каталогов, каждая из которых содержит серию файлов.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?
В этом примере это будет тест {6,7,8}.pdf.
2 ответа
Вот как это работает с find:
find . -name "*.pdf" | while read F; do test -f "${F}.csv" || echo "$F"; done
Использование find предпочтительнее, чем глобализация в оболочке, поскольку он не ограничивает количество аргументов и работает с пробелами и специальными символами.
Я не мог найти способ сделать это с find
напрямую, но это очень просто, используя цикл for:
for file in *.pdf; do [ -f ${file}.csv ] || echo $file; done
Если вам нужно запустить его в верхнем каталоге и сделать его рекурсивным, вы можете использовать find так:
for file in $(find . -iname '*.pdf'); do [ -f ${file}.csv ] || echo $file; done
который выведет что-то вроде этого:
./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
Осторожнее с этим последним, хотя, если вы не уверены, что во входных именах файлов не будет никаких странных символов, убедитесь, что вы установили переменную среды IFS согласно:
OFS=$IFS
export IFS=$'\n'
Конечно, с этого момента становится только противнее.
Я предполагаю, что вы используете Bash.