ファイルが互いに上書きされるように特定の順序でマージする必要がある417のフォルダパスのリストがあります。後でフォルダを変更するときにこれをやり直す必要があるかもしれませんので、手動では行いません。これを行うスクリプトを書く方法を学びたいです。
また、スクリプトがすべてを小文字に変換できる場合は良いでしょう。私がこれでしたのは、圧縮せずに圧縮した後、-LLで解凍するだけでした。しかし、もはやそれを行う必要がない場合は大丈夫でしょう。時間がかかったから。しばらく(17GB)。
リストはこれです
「/ソロ/」
「/ソロ/」
「/ソロ/」
(気になる方のためにmorrowind / openmwのいくつかのモードをマージしてみましょう。)
答え1
次のように動作する必要があります。
while IFS= read -r dir
do
cp -f "$dir"/* target
done < list
ファイルをコピーするディレクトリであるディレクトリのリストlist
はどこにありますか?target
リストの後半に表示されるディレクトリ内のファイルは、リストの前半に表示されるディレクトリ内のファイルを上書きします。
cp -f
コピープログラムに「強制上書き」オプションを指定します。これは次のことを前提としています。
- ディレクトリ名には改行文字は含まれません。 (これにより、単純なテキストファイルにリストできなくなります。)
- リストファイルには実際に引用符が含まれていません。
- 各ディレクトリには(一般)ファイルのみがあり、サブディレクトリや特別な内容はありません。
- 次に始まるファイル名はありません。
.
。
答え2
cp -r $(<sources) target/
動作する必要があります。
これは、パスがすでにファイルにリストされていると仮定しますsources
。
各パスはディレクトリまたはファイルへのパスにすることができますが、ファイルsources
内のすべてのパスにスペース(スペース、タブ、改行など)またはシェルワイルドカード文字(または*
)?
を含めることはできません。 。 (実際の名前に引用符が含まれていない場合)
次のようなものも使用できます。
xargs -t -Isrc cp -r src target/ <sources
これにより、よりエキゾチックなファイル名が許可されますが、改行文字を含むファイル名は許可されません。
bash
以下は、ファイル名のセットを小文字に変換する短いスクリプトです(echo
実際の名前変更を実行するには削除する必要があり、何が起こっているのかを確認するためにそこにあります)。
#!/bin/bash
for path in "$@"; do
dir="${path%/*}"
name="${path##*/}"
if [[ ! "$path" -ef "$dir/${name,,}" ]]; then
echo mv "$path" "$dir/${name,,}"
fi
done
両方のパスが同じファイルを参照している場合、テストはtrueを返します-ef
(この場合、名前の変更は発生しないでください)。変数${name,,}
置換は実際の小文字の役割です。
次のようにディレクトリに適用できます。
$ find target -type f -exec bash tolower.sh {} +