1

У меня есть большая куча каталогов, каждая из которых содержит серию файлов .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 ответа2

5

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

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

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

3

Я не смог найти способ сделать это напрямую с помощью 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.

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