すべてのファイルとフォルダを1つのディレクトリからそのサブフォルダの1つに移動したいと思います。それ、どうやったら出来るの?
BusyBoxとLinuxを使用しています。
例:
/my/path/
内のすべてのファイルとフォルダーを/my/path/subfolder/.
に移動します
ソリューションをコピーしてから削除するのは手頃な価格ではありません。
ありがとう。
さらに掘り下げて実験した後。私は答えを見つけました:-Prune
は、サブディレクトリへの拒否を回避するために使用されます。 ! -name
はターゲットサブディレクトリを除外するために使用され、次にexec
は移動操作を実行します。 {}
は、find
コマンドのファイル/ディレクトリ名に置き換えられます。
find /my/path/* -Prune ! -name subfolder -exec mv {} /my/path/subfolder/. +
mv * subfolder
もちろん、「サブフォルダ」ディレクトリをそれ自体に移動することはできませんが、他のすべては移動します
*
(Shellによって拡張)を使用するソリューションは、/my/path/
内のオブジェクトが多すぎると機能しません。そのような場合、次のようになります。
argument list too long
このアプローチは*
を使用しません:
cd /my/path/ &&
find . -mindepth 1 -maxdepth 1 ! -name subfolder -exec mv -t subfolder/ {} +
残念ながら、find
の-mindepth
および-maxdepth
オプションはPOSIXに準拠していません。 mv
の-t
オプションもそうではないと思います。
このバリアントはPOSIXを満たす必要があります。
cd /my/path/ &&
find . ! -name . -Prune ! -name subfolder -exec mv {} subfolder/ \;
(私は適応しました このUnixとLinux SEの答え )。悲しいことに、見つかったすべてのオブジェクトに対してmv
を呼び出すため、処理が遅くなります。
ディレクトリを新たに作成できる場合のみ(最初は/my/path/subfolder/
も/my/subfolder/
も存在しないはずです)の高速な代替アプローチ:
path/
の名前をsubfolder/
に変更します。path/
を再作成します、subfolder/
をpath/
に移動します。Iノードベースのファイルシステムでは、path/
にオブジェクトがいくつあっても、これは同じくらい高速である必要があることに注意してください。コード:
cd /my/ &&
test ! -e subfolder/ && mv path/ subfolder/ &&
mkdir path/ &&
mv subfolder/ path/
この場合、私は&&
を頻繁に使用して、手順のいずれかが失敗した場合に手順を中止する必要があることを強調しました。ただし、デフォルト以外の権限や所有権などを取得するためにpath/
またはsubfolder/
が必要な場合、このアプローチは不便です。
mv
コマンドを確認することをお勧めします。ディレクトリ内のすべてのファイルとフォルダを検索してサブディレクトリを除外し、find
コマンドでmv
を使用して、見つかったすべてのファイルとフォルダをそのサブディレクトリにコピーすることができます。
同様のスタックオーバーフローの質問を参照してください https://stackoverflow.com/questions/4612157/how-to-use-mv-command-to-move-files-except-those-in-a-specific-directory
これを行う最も簡単な方法は次のとおりです。
mv !(subfolder) subfolder
「!」プログラミング言語と同様に、mvがサブフォルダーを除くすべてのファイルとフォルダーを必要なサブフォルダーに移動するNOTを意味します。
非表示フォルダーやドットフォルダーの移動などの追加事項については、こちらで説明しています: https://askubuntu.com/questions/91740/how-to-move-all-files-in-current-folder-to-subfolder ==