Как скопировать определенные файлы jpg из каталога на основе их имени, совпадающего с файлами txt?

С помощью /opt/report -filesystem "$line" -detailhost.fqdn.com:/ 'host.fqdn.com [/]'передается дословно как один аргумент команды, и вывод set -xговорит вам именно об этом, показывая значение в одинарных кавычках, которые являются дословными кавычками в снаряды.

В

/opt/report -filesystem host.fqdn.com:/ 'host.fqdn.com [/]'

Вы передаете два аргумента команде:host.fqdn.com:/и host.fqdn.com [/]. Это связано с тем, что символ пробела и символы одинарной кавычки являются особыми в синтаксисе оболочки.

Для оболочки, как показано выше, '...'— это дословные кавычки, которые служат для передачи текста буквально без специального обращения с каким-либо символом внутри, и SPC (, когда он сам не цитируется )в синтаксис оболочки используется для разделения аргументов (или, в более общем смысле, токенов в синтаксисе оболочки )

.

Если вы хотите передать host.fqdn.com:/ 'host.fqdn.com [/]'буквально как один аргумент, как показано в выводе set -x, вам понадобится что-то вроде 'host.fqdn.com:/ '\''host.fqdn.com [/]'\''', хотя использование других типов кавычек, таких как "host.fqdn.com:/ 'host.fqdn.com [/]'", также будет работать.

$ printf '<%s>\n' 'host.fqdn.com:/ '\''host.fqdn.com [/]'\'''
<host.fqdn.com:/ 'host.fqdn.com [/]'>
$ printf '<%s>\n' "host.fqdn.com:/ 'host.fqdn.com [/]'"
<host.fqdn.com:/ 'host.fqdn.com [/]'>

Если вам действительно нужно, чтобы host.fqdn.com:/ 'host.fqdn.com [/]'интерпретировался как код оболочки, а не как один литеральный аргумент для передачи команде, вам нужно будет вызвать интерпретатор оболочки для содержимого $line, как с вашим конвейером. на bash(, хотя ваше использование двойных кавычек было неправильным )илиeval:

#!/bin/bash -
set -x
while IFS= read -r line; do
  eval "/opt/report -filesystem $line -detail"
done < objects.lst

Однако это означает, что если строка содержит, например, ;reboot;или $(reboot), это вызовет команду reboot.

Если вы хотите выполнить только токенизацию оболочки и удаление кавычек без других побочных эффектов, таких как выполнение этих команд rebootвыше, вы можете вместо этого использовать zsh, который имеет операторы для этого:

#!/bin/zsh -
set -x
while IFS= read -r line; do
  /opt/report -filesystem "${(Q@)${(z)line}}" -detail
done < objects.lst

Где zвызывает токенизацию как код zsh, а Qудаляет один слой кавычек. Например, в строке вида:

foo 'bar baz' $(echo x y)

Будет передано 3 аргумента :foo, bar bazи $(echo x y).

-2
19.10.2021, 06:49
1 ответ

Решение, которое я могу разработать.

cp to/txtfile/directory
for file in *; do 
  cp -r "source/image_directory/${file%.*}jpg" dest/image_directory/;
done

Спасибо @Philippos за предложение более обобщенного.

Мы также можем применить ту же логику для перемещения файлов.

1
19.10.2021, 11:59

Теги

Похожие вопросы