Unixがサブディレクトリからファイルを移動/削除する


1

現在の作業ディレクトリに複数のサブディレクトリがある場合、特定のファイルタイプのみ、または場合によってはそれらのディレクトリのすべてのコンテンツを作業ディレクトリに移動します。その後; 「rmdir *」それらの空のディレクトリまたは「rm -r」それらのディレクトリ(空でない場合)

これを「検索」ユーティリティで行ってからパイプするべきではありません。「mv」への出力 (検索結果を作業ディレクトリに移動します)?もしそうなら、たとえば、私が渡す必要がある検索オプションは何ですか、またはサブディレクトリ内のファイルをrmまたはmvするためにどのような種類のコマンドを使用し、その後ディレクトリを削除する必要がありますか?

この方法は、同じディレクトリ内で重複するファイル名を移動しても安全ですか?または、たとえばindex.htmlが多数ある場合、ファイルは上書きされますか

これは、unix、mv、またはrmのいくつかのサブディレクトリから指定されたファイルタイプの基本的なタスクです。

回答:


3

以下は、すべてのHTMLファイルをから移動しfoo、空のディレクトリを削除します。

$ find foo -name '*.html' -type f -exec mv -nv "{}" '.' \;
foo/bar/1.html -> ./1.html
./1.html not overwritten
foo/baz/qux/3.html -> ./3.html
foo/baz/qux/5.html -> ./5.html
$ find foo -depth -type d -delete

残っているのは、競合するファイル名を持つHTMLファイル、HTMLファイルではないファイル、および空でないフォルダーです。

自動的にファイルの名前を変更してファイル名の重複を防ぐには、を使用できますmktemp。構文はオペレーティングシステムによって異なり、以下はOS XおよびおそらくBSDで動作します。

find foo -name '*.html' -type f -exec bash -c 'mv -v "$0" "./$( mktemp "$( basename "$0" ).XXX" )"' '{}' \;
foo/bar/1.html -> ./1.html.yNr
foo/baz/1.html -> ./1.html.RUu
foo/baz/qux/3.html -> ./3.html.rzu
foo/baz/qux/5.html -> ./5.html.JyW

見つかったすべてのHTMLファイルに対して、bashを起動し、の後-cにコマンドを実行します。これは実際には、現在のディレクトリにmv(を使用してmktemp)動的に作成された宛先ファイル名を持ちます。

意図したとおりに機能することを確認するにはechomv最初にコマンドをプレビューとして使用できます。

find foo -name '*.html' -type f -exec bash -c 'echo mv -v "$0" "./$( mktemp "$( basename "$0" ).XXX" )"' '{}' \;
mv -v foo/bar/1.html ./1.html.VNf
mv -v foo/baz/1.html ./1.html.pCW
mv -v foo/baz/qux/3.html ./3.html.ADN
mv -v foo/baz/qux/5.html ./5.html.K3w

ご覧のとおり、すべての呼び出しmktempbashスクリプトのおかげで異なる接尾辞になります(呼び出し-exec mvに対して1回評価され、find移動したすべてに同じ接尾辞を使用するため、その部分を通常に含めることはできません)。

関連するファイルの数に応じて、単なるサフィックスよりも大きいランダムサフィックスが必要になる場合があります.XXX


0

次のようなコマンドを使用すると、一度に実行できます。

find . -name '*.goaway' -exec mv '{}' destination \;

しかし、より安全な方法は、findコマンドがあなたのために掘り出しているものを見ることから始めることかもしれません。おそらく、実際の操作を行うために使用できるファイルにそれをパイプします。

そして、はい、すべてのindex.htmlを同じディレクトリに移動すると、それらは互いに重なってしまい、最後に移動したのは最後の1つだけになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.