web-dev-qa-db-ja.com

リストからフォルダにファイルをコピーする

テキストファイルabc.txtがあり、その内容は次のとおりです。

   /lag/cnn/org/one.txt
   /lag/cnn/org/two.txt
   /lag/cnn/org/three.txt

私が使用する場合:

$ tar -cvf allfiles.tar -T abc.txt

リスト内のファイルのタールを取得しています。同様に、abc.txt内のそれらのファイルをフォルダーにコピーすることは可能ですか?

私はこれを試しました:

$ cp --files-from test1.txt ./Folder

しかし、それは機能していません。

3
Mano

tarファイルを作成するための標準(POSIX/Unix)コマンドはpaxであることに注意してください。 paxは、従来のcpioコマンドとtarコマンドを組み合わせたものです。

Tarファイルを作成するには、書き込みモードを使用します。

pax -w < abc.txt > allfiles.tar

代わりにコピーするには、コピーモードを使用します。

pax -rw < abc.txt Folder/

ディレクトリ構造をFolderに再作成することに注意してください。それを平らにしたい場合は、次のことができます。

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

(権限やその他の属性もコピーする場合は、マニュアルページを参照してください。paxは1行に1つのファイルを想定しています。つまり、名前に改行文字が含まれているファイルは、その方法でコピーできません。一部のpax実装は-0オプションをサポートし、代わりにNUL区切りファイルリストを許可します)。

cpioの場合:

cpio -pd < abc.txt Folder/

GNU tar

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

ファイル名に任意の文字を許可する別のオプションは次のとおりです(with GNU cp):

xargs cp -t Folder < abc.txt

(それはディレクトリをフラット化します)。

xargsは、バックスラッシュ、一重引用符、または二重引用符でこれらの区切り文字をエスケープできる場合、空白(スペース、タブ、改行)で区切られたリストを想定しています。したがって、次のようなリストを作成できます。

"file with space"
other-file
'file with "quote" and
newline'
6

Cpに--files-fromオプションがあることをどこで読んだかはわかりませんが、GNU coreutils8.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
Chris Down

cpには--files-fromオプションがありません(少なくともGNU cpはありません)。ただし、rsyncにはあります:

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

/ファイルに絶対パスのファイルが含まれている場合は、test.txtが使用されます。それ以外の場合は、ソースのルートである必要があります。

ファイルが改行ではなくゼロで終了している場合は、--from0オプションを含める必要があります。

2
roaima

これは、単純なbashスクリプトで実現できます。

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
coffeMug