Попытка создать папку и скопировать файл с помощью текстового файла - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь создать папку, используя текстовый файл и скопировать файл. У меня есть два типа файлов:

try.txt

Changes/EMAIL/header-20-percent-off.gif
Changes/EMAIL/header-50-percent-off.gif

демонстрация папки с именем zip2

 zip2/EMAIL/header-20-percent-off.gif
 zip2/EMAIL/header-50-percent-off.gif

Код:

mkdir -p dirname `xargs -a try.txt`
cp -R  {Dont know how this will work :( }

Фактический выход:

Changes/EMAIL/header-20-percent-off.gif/
             /header-50-percent-off.gif/

Ожидаемый результат:

Changes/EMAIL/header-20-percent-off.gif
             /header-50-percent-off.gif

Как вы можете видеть по некоторым причинам, он думает, что header-20-percent-off.gif и header-50-percent-off.gif являются каталогами.

После создания Changes/Email/ я хотел бы скопировать два файла gif header-20-percent-off.gif и header-50-percent-off.gif есть.

1 Ответ

1 голос
/ 03 марта 2020

Сначала создайте папки:

<try.txt xargs -d$'\n' dirname | xargs -d$'\n' mkdir -p

Затем скопируйте файлы. Сначала подготовьте поток с правильными исходными и целевыми каталогами с sed, а затем перейдите к xargs:

sed 's@^Changes/\(.*\)@zip2/\1\n&@' try.txt |
xargs -d$'\n' -n2 cp

Но если вы не владеете bash, просто прочитайте поток построчно:

while IFS= read -r dest; do
   dir=$(dirname "$dest")
   mkdir -p "$dir"
   src=$(sed 's@^Changes@zip2@' <<<"$dest")
   cp "$src" "$dest"
done < try.txt

Не используйте кавычки `, они крайне обескуражены. Вместо этого используйте $(...) для подстановки команд.

Простое выполнение xargs -a try.txt без команды не имеет смысла, просто $(cat try.txt) или лучше $(<try.txt).

Используйте параметр -t с xargs чтобы посмотреть, что он делает.

Явно укажите разделитель с помощью xargs -d$'\n' - иначе xargs будет анализировать " ' и \ специально.

Я считаю, если вам повезет и вам удастся поработать, вы можете просто использовать rsync с чем-то вместе rsync --include-from=try.txt changes/ zip2/.

...