Расширение параметров для удаления строк с несколькими шаблонами - PullRequest
0 голосов
/ 20 апреля 2020

Я создаю скрипт, который отправляет выходные данные команды «find» во временный файл, и оттуда я использую «read», чтобы перебрать все пути и напечатать два поля в файл csv, одно поле для имени файл и другой для полного пути.

find -type f \( -iname \*.mp4 -o -iname \*.mkv \) >> $tempfile
while read -r file; do
    printf '%s\n' ${file##*/} ${file} | paste -sd ' ' >> $csvfile
done < $tempfile
rm $tempfile

Проблема в поле для имен ${file##*/}. У некоторых файлов есть пробелы в их именах, и это приводит к тому, что они не печатаются правильно в файле csv, я знаю, что я мог бы использовать это ${file//[[:blank:]]/}, чтобы удалить пробелы, но мне также нужно сохранить это ${file##*/}, так как расширение этого параметра позволяет мне вырезать все, кроме самого имени моих файлов (и распечатать их в первом поле файла csv).

Я искал способ объединить два параметра расширения ${file##*/} и ${file//[[:blank:]]/} но я не нашел ничего связанного. Можно ли решить это, используя только расширение параметров? Если нет, то какие другие решения могут это исправить? может быть, регулярное выражение?

Редактировать: Также мне нужно будет добавить 3-е поле, в котором значение будет зависеть от переменной.

1 Ответ

1 голос
/ 20 апреля 2020

Если вы используете GNU find (и, возможно, другие реализации?), Это может быть значительно упрощено:

find dir/ -type f \( -iname "*.mp4" -o -iname "*.mkv" \) \
          -printf '"%f","'"${newvar//%/%%}"'","%p"\n' > "$csvfile"

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


Если используется какая-либо другая версия find ... ну, во временном файле нет необходимости. Просто перенаправьте вывод непосредственно в ваше время, пока l oop:

find test1/ -type f \( -iname "*.mp4" -o -iname "*.mkv" \) -print0 |
while IFS= read -d '' -r file; do
    name=$(basename "$file")
    printf '"%s","%s","%s"\n' "${name//\"/\"\"}" "$newvar" "${file//\"/\"\"}"
done > "$csvfile"

В этом случае будут выведены двойные кавычки, появляющиеся в имени файла, поэтому, если это так с вашими файлами, предпочтите его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...