つまり...フォルダのリストが表示されます。おそらくテキストファイルで?例は提供していませんが、名前の衝突はないとコメントで述べています。
1 つのオプションはrsync
、ほとんどのバージョンの Unix および Linux でアドオン パッケージとして利用できる を使用することです。Rsync は基本的に高度なコピー ツールです。1 つ以上のソースと宛先を指定すると、物事が確実に同期されます。物事を再帰的にコピーする方法を知っていますが、その再帰を特定の深さに制限するように指示することはできないため、次は指定された各アイテムをターゲットにコピーしますが、再帰的にコピーします。
xargs -L 1 -J % rsync -vi -a % /path/to/target/ < sourcelist.txt
sourcelist.txt にの行が含まれている場合/foo/bar/slurm
、slurm
ディレクトリ全体が にコピーされ/path/to/target/slurm/
ます。ただし、これには、 に含まれるディレクトリが含まれますslurm
。
これは、bash だけでなく、ほぼすべてのシェルで機能します。ただし、sourcelist.txt の行の 1 つに空白やさまざまな特殊文字が含まれていると失敗します。そのため、ソース (コマンド ラインまたは sourcelist.txt 内) が正しくフォーマットされていることを確認することが重要です。また、ソース ディレクトリに末尾のスラッシュが含まれている場合、rsync の動作は異なります。man ページを読んで、必要な動作を決定する必要があります。
入力ファイルは、sh または bash でかなり簡単にサニタイズできます。例えば:
#!/bin/sh
# Avoid commented lines...
grep -v '^[[:space:]]*#' sourcelist.txt | while read line; do
# Remove any trailing slash, just in case
source=${line%%/}
# make sure source exist before we try to copy it
if [ -d "$source" ]; then
rsync -vi -a "$source" /path/to/target/
fi
done
しかし、これはまだrsyncの-a
オプションを使用しており、再帰的にコピーします。
rsync だけを使用してこれを行う方法がわかりません。Rsync には-depth
オプションがありませんfind
。しかし、これを 2 つのパスで行うことがわかります。1 回目はすべてのディレクトリをコピーし、もう 1 回は各ディレクトリからファイルをコピーします。
そのため、例を作成し、フォルダー名にスペースや改行などの特殊文字が含まれていないと仮定します。 (これは重要。)
まず、すべてのディレクトリ自体を再帰的にコピーするのではなく、1 パスでコピーしてみましょう。
xargs -L 1 -J % rsync -vi -d % /path/to/target/ < sourcelist.txt
この-d
オプションは、sourcelist.txt で指定されたディレクトリーが存在する場合、それを作成します。
次に、ソースのリストを見てみましょう。それぞれをコピーします。
# Basic sanity checking on input...
grep -v '^[[:space:]]*#' sourcelist.txt | while read line; do
if [ -d "$line" ]; then
# Strip trailing slashes, as before
source=${line%%/}
# Grab the directory name from the source path
target=${source##*/}
rsync -vi -a "$source/" "/path/to/target/$target/"
fi
done
$source
rsync 行の末尾のスラッシュに注意してください。これにより、rsyncは directory ではなく、ディレクトリの内容をコピーします。
これはすべて意味がありますか?それはあなたの要件に合っていますか?