Существует множество способов оптимизации (например, создать regex из содержимого Delete_Name.txt
и использовать -find
-iregex
, а не -name
, чтобы запустить find
только один раз, а не по одному разу на строку в Delete_Name. txt
), но очевидная ошибка заключается в том, что $file, похоже, нигде не определен - вы читаете вывод awk
в $line
, а не в $file
.
Может быть, попробуйте что-то вроде этого:
awk '/SOURCE/ {print $3}' /MAC/Delete_Name.txt |
while IFS= read -r file; do
find /OS/ -iname "$file.pdf"
done | sed -e 's:[^/]*$/::'
(это может быть все в одной строке, я просто разбил это на несколько строк для удобства чтения и чтобы избежать горизонтальных полос прокрутки на этом сайте)
Помимо исправления упомянутой ошибки, я установил IFS=
и использовал опцию -r
в while read
, которая будет читать всю строку за раз (даже если строка содержит пробелы или табуляцию) и присваивать всю строку в $file.
Следующая версия find -regex
запускает find
только один раз, независимо от того, сколько файлов перечислено в /MAC/Delete_Name.txt
. Для этого требуется GNU или FreeBSD версия find
для опции -iregex
.
regexp=$(awk '/SOURCE/ {print $3}' /MAC/Delete_Name.txt |
sed -n -e '1,$H; ${ g; s/\n/\\|/g ; s/^\\|//p}')
find /OS/ -iregex ".*\($regexp\)\.pdf$" | sed -e 's:[^/]*$/::'
Предупреждение: если в /MAC/Delete_Name.txt
много файлов, построенный regexp будет слишком большим, чтобы уместиться в одной командной строке, и команда find
завершится неудачей. В зависимости от оболочки, ОС и их версий, ограничение может составлять несколько тысяч символов в командной строке оболочки.
У меня аналогичная настройка и проблема. Я только начал использовать sshcode , который позволяет вам «запускать VS Code на любом сервере через SSH» и, похоже, отвечает всем требованиям. Он запускает VS Code на удаленном сервере и предоставляет вам полноценную IDE в Chrome на вашем локальном компьютере.