各ファイルのディレクトリを作成し、各ファイルの "n"コピーを作成します。

各ファイルのディレクトリを作成し、各ファイルの

私のファイルの解決策を見つけて、完璧なものを見つけて、ここに答えを与えます。 親ディレクトリの各ファイルのディレクトリを作成する方法

しかし、今私の質問は、次のコマンドラインを使用して、処理中の各ファイルに対して作成されたディレクトリのコピーを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.txtmkdirteerm

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 -fcpループが成功しなくても(データ損失が発生した場合)、最後にコメントを解除すると、元のファイルが削除されます。

おすすめ記事