Скопировать список файлов

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

Я пытался это сделать:

 cp `cat list.txt` new_folder 

Но это не сработало.

Как вы это сделаете?

Обновить:

Спасибо за все ваши очень интересные ответы. Я этого не просил 🙂

После того, как вы попробовали решение выше второго раза, кажется, что cp напечатал справочную new_folder потому что папка new_folder еще не существует! Извините, это кажется глупой ошибкой … Когда я создаю папку раньше, она работает.

Тем не менее, я многому научился из всех ваших ответов и решений, спасибо за то, что вы их пишете.

3 Solutions collect form web for “Скопировать список файлов”

Попробуйте использовать xargs:

 cat list.txt | xargs -J % cp % new_folder 

Обновить:

Я сделал это на OS X, у которого другая версия, чем версии GNU / Linux. xargs который исходит от GNU findutils , не имеет -J но у него есть -I что похоже (как -J Деннис Уильямсон в комментарии). Версия xargs OS X имеет как -I и -J которые имеют несколько другое поведение – либо будут работать для этого оригинального вопроса.

 $ cat list.txt one two.txt three.rtf $ cat list.txt | xargs -J % echo cp % new_folder cp one two.txt three.rtf new_folder $ cat list.txt | xargs -I % echo cp % new_folder cp one new_folder cp two.txt new_folder cp three.rtf new_folder 

Нет необходимости в cat :

 xargs -a list.txt cp -t new_folder 

Или используя длинные варианты:

 xargs --arg-file=list.txt cp --target-directory=new_folder 

Вот несколько версий оболочки:

Bash:

 for file in $(<list.txt); do cp "$file" new_folder; done 

или

 cp $(<list.txt) new_folder 

Sh (или Bash):

 # still no cat! while read -r line; do for file in $line; do cp "$file" new_folder; done; done < list.txt 

или

 # none here either while read -r line; do cp $line new_folder; done < list.txt 

или

 # meow for file in $(cat list.txt); do cp "$file" new_folder; done 

или

 # meow cp $(cat list.txt) new_folder 

У меня был смущающий круглый ответ здесь раньше, но ответ Дениса напомнил мне, что я пропустил самое основное. Итак, я удалил свой первоначальный ответ. Но так как никто не сказал об этом самом главном, я думаю, что стоит положить его сюда.

Исходный вопрос: «У меня есть текстовый файл со списком имен файлов, разделенных пробелами. Как скопировать их в один целевой каталог». Сначала это может показаться сложным или сложным, потому что вы думаете, что вам нужно каким-то образом извлечь элементы из файла определенным образом. Однако, когда оболочка обрабатывает командную строку, первое, что она делает, – это отдельный список аргументов в токенах и (здесь бит никто не сказал прямо) пробегает отдельные токены . (Newlines также разделяет токены, поэтому тест Doug Harris с разделом, разделенным новой строкой, имел тот же результат). То есть оболочка ожидает и может уже обрабатывать список, разделенный пробелами.

Итак, все, что вам нужно сделать, это поместить список разделенных пробелами (который у вас уже есть) в нужное место в вашей команде. В этой команде есть несколько вариантов:

 cp file1 file2 file3...file# target 

Единственная морщина заключается в том, что вы хотите получить список файлов с 1 по # из текстового файла.

Как отмечает Деннис в своем комментарии, ваша первоначальная попытка ( cp cat list.txt new_folder ) должна была работать уже. Зачем? Поскольку внутренняя команда cat list.txt обрабатывается сначала оболочкой и расширяется в file1 file2 file3...file# , что именно то, что оболочка ожидает и хочет в той части команды. Если это не сработало, то либо (1) у вас была опечатка, либо (2) ваши имена файлов были как-то странными (у них были пробелы или другие необычные персонажи).

Причина, по которой все ответы Денниса работают, заключается в том, что они предоставляют необходимый список файлов для работы cp , помещая этот список, где он принадлежит всей команде. Опять же, сама команда такова:

 cp list-of-files target_directory 

Легко понять, как все это объединяется в этой версии:

 cp $(<list.txt) new_folder 

$() Заставляет оболочку запускать команду в круглых скобках, а затем заменять ее вывод в этой точке в большей строке. Затем оболочка запускает линию в целом. Кстати, $() – это более современная версия того, что вы уже делали с backticks (`). Далее: < является оператором перенаправления файлов. Он сообщает оболочке о list.txt содержимого list.txt на стандартный ввод. Поскольку бит $() обрабатывается первым, вот что происходит поэтапно:

  1. cp $(<list.txt) new_folder # split line into three tokens: cp, $(<list.txt), new_folder cp $(<list.txt) new_folder # split line into three tokens: cp, $(<list.txt), new_folder
  2. cp file1 file2 file3...file# new_folder # substitute result of $(<list.txt) into the larger command

Очевидно, что шаг 2 – это просто обычная команда cp вы хотели.

Я понимаю, что я сильно избиваю эту (возможно, очень мертвую) лошадь, но я думаю, что это стоит того. Понимание того , как оболочка обрабатывает команду, может помочь вам лучше ее написать и упростить. Он также покажет вам, где проблемы, вероятно, будут скрываться. В этом случае, например, мой первый вопрос для вас должен был касаться смешных имен файлов или возможной опечатки. Никакой акробатики не было.

  • Создавать распределение размеров файлов из командной строки
  • Dd создает поврежденные образы ISO на Snow Leopard (независимо от того, вызваны ли они из скрипта или оболочки)
  • Custom Vim Highlighting (работает только с определенными типами файлов)
  • Что такое сообщение «У вас есть новое письмо» в Linux / UNIX?
  • Как я могу выполнить полную установку Cygwin с помощью нового установщика?
  • Как я могу найти историю bash и повторить команду?
  • Как отключить отображение даты и времени в вертикальных расколах экрана GNU?
  • Завершение процесса в unix вместо его прерывания
  • Атрибуты файла
  • Печать страниц с 7 по 17 по lpr
  • Выбор между .bashrc, .profile, .bash_profile и т. Д.
  • Interesting Posts

    Объясните TRIM, и все SSD собираются поддержать это с помощью обновлений прошивки?

    Есть ли инструмент командной строки, чтобы перевести Windows 8 в режим сна?

    ПК не загружается с подключенными USB-устройствами

    Почему первое изображение меняется так быстро при создании видео с изображений через FFmpeg?

    Каково влияние запуска процессора на 100% в течение длительного времени за раз?

    Символ Escape @ в режиме просмотра бритвы

    Как проверить, поврежден ли файл .wmv?

    Проблемы с сжатием FFmpeg с потерями

    Как я могу получить DateTime для начала недели?

    Когда происходит инициализация статического classа?

    Найти серийный номер шлюза без чехла

    Как получить описание C # Enum из значения?

    RAMDISK OS? Установка Windows 10 на ramdisk

    Что представляет собой значок Windows 8 в качестве значка прямоугольника в строке заголовка?

    Может ли вирус ввести через Ubuntu и повлиять на Windows при двойной загрузке?

    Давайте будем гением компьютера.