フォルダ名の一部を新しい名前としてファイルを繰り返しコピーし、名前を変更します。

フォルダ名の一部を新しい名前としてファイルを繰り返しコピーし、名前を変更します。

.csv拡張子を持つファイルを含むフォルダを繰り返しコピーし、単一のフォルダにコピーするときに名前を変更しようとします。

判別できないファイル名の変更を除いて、ほぼ同じです。

誰でも助けることができますか?

find "/IMPORTS/EFHG2" -iname '*.csv*' -exec cp {} /temp/Template \;

名前の変更については、ファイルがある親フォルダの表示を提供できる項目を探しています。

  • オリジナル( file1.csvfile2.csv)
  • 修正済み(dir1.file1.csv、、dir2.file1.csv

ベストアンサー1

次の構造があります。

├── destdir
└── srcdir
    ├── dir1
    │   └── with space.csv
    ├── dir2
    │   └── infile.csv
    └── dir3
        └── otherfile.Csv

実行コマンド:

find "/path/to/srcdir" -type f -iname '*.csv' -exec sh -c '
    path="${1%/*}"; filename="${1##*/}";
    echo cp -nv "${1}" "/path/to/destdir/${path##*/}.${filename}" ' sh_cp {} \;

次の出力が生成されます(乾燥モードで実行)。

cp -v /path/to/srcdir/dir2/infile.csv     /path/to/destdir/dir2.infile.csv
cp -v /path/to/srcdir/dir1/with space.csv /path/to/destdir/dir1.file with space.csv
cp -v /path/to/srcdir/dir3/otherfile.Csv  /path/to/destdir/dir3.otherfile.Csv

コピーをインポートして感情の名前を変更するためにecho前のコマンドを削除すると(模擬実行用)、次のような構造が得られます。cp

├── destdir
│   ├── dir1.with space.csv
│   ├── dir2.infile.csv
│   └── dir3.otherfile.Csv
└── srcdir
    ├── dir1
    │   └── with space.csv
    ├── dir2
    │   └── infile.csv
    └── dir3
        └── otherfile.Csv

ちなみに、サブディレクトリに同じファイル名、同じ親ディレクトリ名が存在すると、コマンドで見つけた最新のファイルで上書きされるので、findこれを防止するためにコマンドを使用したため、-n同じcpファイルはコピーされません。 、これにご注意ください。


説明する:

find "/path/to/srcdir" -type f -iname '*.csv' -exec sh -c '...' sh_cp {} \;

.csvサフィックス(大文字と小文字を無視)を持つファイルを繰り返し検索し、名前を付けたファイルごと-execにインラインスクリプトを使用しますshsh -c '...'sh_cp{}ファイルパスfindコマンドで検索し、それをスクリプトに渡すか、パラメータを介してアクセスでき$1ます${1}

  • ${1%/*}:パラメータから最短のサフィックスを削除します${1}(通知)。シェルパラメータ拡張)、${1}上記のようにファイルパスだから我々はあきらめるファイル名+最後/からファイルパスそしてゆうだけそしてpath変数に保存されます。

    ${1}      --> /path/to/srcdir/dir2/infile.csv
    ${1%/*}   --> /path/to/srcdir/dir2
    
  • ${1##*/}${1}:この方法でパラメータから最長のプレフィックスを削除します。~からファイルパスそしてゆうだけファイル名そしてfilename変数に保存されます。

    ${1}      --> /path/to/srcdir/dir2/infile.csv
    ${1##*/}  --> infile.csv
    

    そしてそれに応じて:

    path                    --> /path/to/srcdir/dir2
    ${path##*/}             --> dir2
    ${filename}             --> infile.csv
    ${path##*/}.${filename} --> dir2.infile.csv
    

ヒント:

xYz='to-test/path/to/srcdir/dir2/infile.csv'
${xYz%/*}   --> to-test/path/to/srcdir/dir2
${xYz%%/*}  --> to-test
${xYz#*/}   --> path/to/srcdir/dir2/infile.csv
${xYz#*/}   --> infile.csv

おすすめ記事