.csv
拡張子を持つファイルを含むフォルダを繰り返しコピーし、単一のフォルダにコピーするときに名前を変更しようとします。
判別できないファイル名の変更を除いて、ほぼ同じです。
誰でも助けることができますか?
find "/IMPORTS/EFHG2" -iname '*.csv*' -exec cp {} /temp/Template \;
名前の変更については、ファイルがある親フォルダの表示を提供できる項目を探しています。
- オリジナル(
file1.csv
、file2.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
にインラインスクリプトを使用しますsh
sh -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