Файлы копии от списка до папки

Наконец корректный ответ на эту ошибку также:

QIconvCodec::convertToUnicode: using Latin-1 for conversion, iconv_open failed
QIconvCodec::convertFromUnicode: using Latin-1 for conversion, iconv_open failed

Это не имеет никакого отношения к Вашим установленным шрифтам, но с недостающими glibc-пакетами.

3
23.12.2013, 00:29
5 ответов

Обратите внимание что стандартная команда (POSIX/Unix) для создания a tar файл pax. pax комбинирует традиционное cpio и tar команды.

Для создания файла tar используйте режим записи:

pax -w < abc.txt > allfiles.tar

Для копирования вместо этого, используйте режим копии:

pax -rw < abc.txt Folder/

Обратите внимание, что это воссоздает структуру каталогов в Folder. Если Вы хотите сгладить его, Вы могли бы сделать:

pax -rws '|.*/||' < abc.txt Folder/

(см. страницу справочника, если Вы хотите скопировать полномочия или другие атрибуты также. pax ожидает один файл на строку, что означает файлы, имя которых содержит символы новой строки, не может быть скопирован тот путь, некоторые pax реализации поддерживают a -0 опция позволить a NUL разграниченный список файлов вместо этого).

С cpio:

cpio -pd < abc.txt Folder/

С GNU tar:

tar -cf - -T abc.txt | (cd Folder && tar xf -)

Другая опция позволить любой символ в именах файлов (с GNU cp):

xargs cp -t Folder < abc.txt

(который сглаживает каталоги).

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

"file with space"
other-file
'file with "quote" and
newline'
6
27.01.2020, 21:08
  • 1
    +1 для cpio -pd < abc.txt Folder/ - это работало на меня, хотя имена файлов содержали пробелы, где другие подходы перестали работать. "Linux" –  david 17.09.2015, 13:53
  • 2
    @david, что привели к сбою другие подходы в моем ответе? –  Stéphane Chazelas 17.09.2015, 14:37
  • 3
    я только попробовал xargs подходы из Ваших и других ответов и они все перестали работать, то же как значение по умолчанию cp варианты. –  david 17.09.2015, 15:52
  • 4
    @david, для xargs, как я сказал в своем ответе, необходимо написать список в формате, ожидаемом xargs, который не находится на пути на строку. –  Stéphane Chazelas 17.09.2015, 18:17

Я не уверен, где Вы читаете, то CP имеет a --files-from опция, но у меня, конечно, нет того GNU coreutils 8.22 использования.

Пока Ваши имена файлов не имеют никаких новых строк в них, можно сделать это (с bash4 +):

mapfile -t files < test1.txt
cp -- "${files[@]}" Folder/

Если у Вас нет bash4 +, то можно вручную заполнить массив и использовать его (или просто звонить cp непосредственно из read для каждого файла, но это будет медленнее):

while IFS= read -r file; do
    files+=( "$file" )
done < test1.txt
cp -- "${files[@]}" Folder/
5
27.01.2020, 21:08

Можно достигнуть этого простым сценарием удара:

for i in $(cat path_to_abc.txt)
do 
  cp "$i" path_to_Folder
done

Более безопасный путь, который может иметь дело с произвольными именами файлов:

while IFS= read -r file; do 
    cp -- "$file" path_to_Folder
done
2
27.01.2020, 21:08
  • 1
    Это повредится, если какое-либо имя файла будет содержать символ от $IFS, который довольно возможен. –  Chris Down 22.12.2013, 11:06
  • 2
    @ChrisDown Его файлы имеет простые имена! ;) :P –  coffeMug 22.12.2013, 11:19
  • 3
    , который я не знаю, как можно сказать это из списка трех имен файлов заполнителя. –  Chris Down 22.12.2013, 11:52
  • 4
    @ChrisDown, который также повреждается на globbing символах (звезда, вопросительный знак, левая квадратная скобка) и имена файлов, запускающиеся с -. set -f; IFS=$'\n'; cp -- $(cat path_to_abc.txt) path_to_folder не имел бы тех проблем. (формат файла списка не может позволить новые строки так или иначе) –  Stéphane Chazelas 22.12.2013, 16:02

cpне имеет опции --files-from(по крайней мере, GNU cpне имеет ), но rsyncимеет:

rsync --files-from abc.txt -av / Folder/

/используется, если ваш файл test.txtсодержит файлы с абсолютными путями. В противном случае это должен быть корень источника.

Если ваши файлы завершаются нулем -, а не символом новой строки -, вы должны включить опцию --from0.

2
27.01.2020, 21:08

Если вы просто хотите скопировать файлы с похожими именами, вы можете использовать это:

Перейти в исходную папку

cp $(ls  | grep 'one' | grep 'two') /tmp/

Таким образом, все файлы, содержащие строку один и два в своих именах, будут скопированы в каталог tmp

0
18.06.2020, 10:32

Теги

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