タイミング:busyboxの検索はバッチ処理されません。 -実現する

タイミング:busyboxの検索はバッチ処理されません。 -実現する

私はbusyboxにのみアクセスできます。

次のフォルダがあります。

prueba/$: ls
./uno
./dos
./tres

2つのサブディレクトリ(uno、dos)ごとに別のサブディレクトリ(tres)に移動したい多くのファイル(名前にスペースとASCII以外の文字を含む)があります。

だから私はこれをしました(コピーしてyesを使うときに重複を防ぐために、[tres]ディレクトリにすでに存在するすべてのファイルを置き換えるために以前にmv -fに問題があったので、文字をエスケープしました)。 :

prueba/$: busybox find . -type f -not \( -path . -o -path ./tres \) -exec sh -c ' yes | mv "$1" ./tres ' sh {} \+

ただし、見つかった最初のファイルだけを移動して終了します。

しかし、私が実行した場合:

prueba/$: busybox find . -type f -not \( -path . -o -path ./tres \) -exec sh -c ' yes | mv "$1" ./tres ' sh {} \;

期待していたものを手に入れました。すべてのファイルは、サブディレクトリ「uno」と「dos」からサブディレクトリ「tres」に移動されます。

;[暗黙的ループ]と[暗黙的バッチング]があるときにアクティブに+なる内部メカニズムは何ですか?

最初のコマンドライン()+にどのような問題がありますか?

以下は不可能です。

mv -f ./uno/* ./dos/* ./tres/

私はコードを1行だけ実行し、タスクを完了すればよい自動化タスクを実行しています。その上、それは退屈な解決策である。

編集する:

後ろの理由find . -exec sh -c 'CMD "$1"' sh {} \;

「find -exec sh -c」を使っても安全ですか?

答え1

次に変更してください。

find uno/ dos/ -type f -exec sh -c 'exec mv -f "$@" tres/' sh {} +

コードの問題:

  • find . -not -path ./tres確かに除外します./tresが、除外しません。./tres/any-file-in-it
  • -exec sh 'mv "$1" tres' sh {} +sh引数と同じ数のファイルを使用して呼び出しますが、最初のファイル($1)のみを移動します。"$@"次に展開みんな位置引数は、作成したように別の引数として提供されます。"$1" "$2" "$3" ... "$last"
  • 標準としての参考!は非標準を置き換えます。-not
  • これは、+どのシェルでも特殊文字ではないことに注意してください。引用する必要はありません。
  • まず、メッセージを表示しない-fオプションに注意してください。それでも使用したい場合は、これを行うことができます。なぜなら、andはstdinを継承し、そこからsを読むからです。mvyesyesyes | find ... -exec sh -c 'exec mv ...shmvfindy
  • mvGNU coreutilsと最新バージョンの実装をbusybox使用すると。shfind ... -exec mv -ft tres {} +

./tres現在のディレクトリのファイルを除くすべてのディレクトリでファイルを(再帰的に)移動し、現在のディレクトリのファイルを除外するには、次の手順を実行する必要があります。

LC_ALL=C find . -path ./tres -prune -o \
                -path './*/*' -type f -exec sh -c 'exec mv -f "$@" tres/' sh {} +

上記の内容はファイルを検索しないように-prune指示しますが、他のファイル(soと組み合わせて文字だけでなくすべてのバイト文字列と一致する)の場合、パスに先行するディレクトリの後に1つ以上のファイルが含まれているため、現在のディレクトリのファイルは除外されます。find./tres-path './*/*'LC_ALL=C*/./

そしてzsh

set -o extendedglob # best in ~/.zshrc
mv -f -- (^tres)/**/*(D.) tres/

ただし、現在のディレクトリにそのディレクトリへのシンボリックリンクがある場合は、それに従います。パラメータの数とサイズのシステム制限に達しても失敗することがあります(zargsこのトラブルシューティングを参照)。

対照的に、globはファイルリストを並べ替えるので、同じ名前のファイルが複数ある場合、最終的に出てくるファイルはより決定的です(これはパスが最後のファイルになりますが、順序が来るので注意してくださいfind)最後)は語彙です。zsh./tresunodos他のすべては消えます)


1数字の順序を取得するためにglob修飾子を追加できますが、nこれは数字の順序でのみ機能します(例:dir2before dir10unoafterソートは続行dos)。

関連情報