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

У меня есть список файлов, разделенных пробелами в файле 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 вы хотели.

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

  • Как gzip несколько файлов в один файл gz?
  • Терминал Vs. Shell
  • Как ssh к недоступной удаленной машине путем туннелирования через сервер, к которому все могут добраться?
  • Как я могу запустить другую команду, но с теми же аргументами?
  • Чем отличается Ctrl + Z и Ctrl + C в командной строке Unix?
  • Как tar.gz все под xx MB?
  • Что такое сообщение «У вас есть новое письмо» в Linux / UNIX?
  • Используя команду history с помощью ssh и получать выходные данные с отметками времени
  • Невозможно редактировать файлы в группе _www на OS X
  • Есть ли способ увидеть какой-либо прогресс в tar за файл?
  • Powershell эквивалентен команде unix `which`?
  • Какая связь между Unix, Linux, Ubuntu, Debian и Android?
  • Interesting Posts

    Оптический дисковод значительно замедляет загрузку

    Как изменить экран входа / блокировки по умолчанию в Windows 8?

    Как показывать вывод на терминал и сохранять в файл одновременно?

    Как программно сделать снимок экрана?

    Как захватить неподвижное изображение с цифрового видео?

    Есть ли способ пропустить меню «Пуск» и перейти прямо к рабочему столу (без отключения современного пользовательского интерфейса)?

    Способ избежать тайм-аута соединения ssh и замораживания терминала GNOME

    Синхронизация файлов cookie между браузерами

    Как вы создаете символическую ссылку с относительным путем с помощью mklink?

    Избегайте ffmpeg, чтобы потерять ключевые флеш-файлы

    Windows 7 Вход в систему с временным профилем

    Уточнение о Lucid Virtu

    Беспроводная связь: HardBlock

    Я получаю красную полосу при попытке установить Windows 7 DVD, и она зависает

    Как я могу вернуться к созданию сборки окна 10 без потери моей программы

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