テキストファイル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
しかし、それは機能していません。
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'
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/
cp
には--files-from
オプションがありません(少なくともGNU cp
はありません)。ただし、rsync
にはあります:
rsync --files-from abc.txt -av / Folder/
/
ファイルに絶対パスのファイルが含まれている場合は、test.txt
が使用されます。それ以外の場合は、ソースのルートである必要があります。
ファイルが改行ではなくゼロで終了している場合は、--from0
オプションを含める必要があります。
これは、単純な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