私のファイルの解決策を見つけて、完璧なものを見つけて、ここに答えを与えます。 親ディレクトリの各ファイルのディレクトリを作成する方法
しかし、今私の質問は、次のコマンドラインを使用して、処理中の各ファイルに対して作成されたディレクトリのコピーを50個作成する方法です。
ls -p | grep -v / | xargs -t -n1 -i bash -c 'for i in {1..50}; do cp {} "{}_folder/copy${i}_{}" ; done'
以下を得る
-file1.csv---->folder_for_file1---->1copy_file1.csv,2copy_file1.csv,3copy_file1.csv........50copy_file1.csv
-file2.csv---->folder_for_file2---->1copy_file2.csv,2copy_file2.csv,3copy_file2.csv........50copy_file2.csv
-file3.csv---->folder_for_file3---->1copy_file3.csv,2copy_file3.csv,3copy_file3.csv........50copy_file3.csv
...
-file256.csv---->folder_forfile256---->1copy_file256.csv,2copy_file256.csv,3copy_file256.csv........50copy_file256.csv
これを以前の答えとどのように一致させることができますか? ? 、この回答の関数コードを含める
cd ParentFolder
for x in ./*.csv; do
mkdir "${x%.*}" && mv "$x" "${x%.*}"
done
この素晴らしい回答を書いた人には、すべての功績が戻ってくれてありがとう。
ベストアンサー1
$name
{1..50}"$name"
シェルから50個の文字列を生成するために使用できます。各文字列には1から50までの数字が前に付けられ、その後に文字列が続きますbash
。
一度にすべて書き込むには、以下を使用しますtee
。
tee {1..50}"$name" >/dev/null <somefile
...somefile
ファイルデータを50回繰り返す必要がある場合です。このtee
ユーティリティは、標準入力ストリームをコマンドラインで指定されたすべてのファイルと標準出力にコピーします(標準出力ストリームにリダイレクトする理由/dev/null
)。
ディレクトリ内のすべての一般ファイルのディレクトリを作成します$topdir
。
[ -n "$topdir" ] && cd -- "$topdir" || exit 1
for name in *; do
if [ ! -f "$name" ] || [ -h "$name" ]; then
# $name refers to non-regular file,
# or to a symbolic link pointing to a regular file.
continue
fi
mkdir -- "${name%.*}"
done
--
コマンドラインオプションの終わりを示すために使用されます。 (または下)と組み合わせて使用すると、1つ以上のオプションとして誤って解釈される可能性があるかのようにダッシュ$name
で開始できるかどうか(この場合)が不明な場合に使用するのが便利です。-farse.txt
mkdir
tee
rm
mkdir
ファイル名にドットが含まれていない場合、スクリプトは既存のファイルと同じ名前のディレクトリを作成しようとするため、呼び出しは失敗します。
このファイルを修正して、新しく作成したディレクトリに50回コピーし(該当するディレクトリが作成された場合)、元のファイルを削除します(元のファイルを削除するかどうかはあなたの質問で明確ではないので、rm -f
安全のためにLoseと言いました) 。 :
[ -n "$topdir" ] && cd -- "$topdir" || exit 1
for name in *; do
if [ ! -f "$name" ] || [ -h "$name" ]; then
# $name refers to non-regular file,
# or to a symbolic link pointing to a regular file.
continue
fi
destdir=${name%.*}
if mkdir -- "$destdir" && tee -- "$destdir"/{1..50}"$name" >/dev/null <"$name"
then
printf 'Would remove "%s"\n' "$name"
#rm -f -- "$name"
fi
done
代わりに、tee
単純なループを使用してファイルを50回コピーします。
[ -n "$topdir" ] && cd -- "$topdir" || exit 1
for name in *; do
if [ ! -f "$name" ] || [ -h "$name" ]; then
# $name refers to non-regular file,
# or to a symbolic link pointing to a regular file.
continue
fi
destdir=${name%.*}
mkdir -- "$destdir" || continue
for newname in {1..50}"$name"; do
cp -- "$name" "$destdir/$newname"
done
printf 'Would remove "%s"\n' "$name"
#rm -f -- "$name"
done
rm -f
cp
ループが成功しなくても(データ損失が発生した場合)、最後にコメントを解除すると、元のファイルが削除されます。