78401


macでサブフォルダ内のファイルを親フォルダに集める操作を行いたいと考えています。次の記事を参考にしました。

[[Mac] サブフォルダ内のファイルを親フォルダに集める【フラット化のコマンド】](https://chiilabo.com/2020/09/mac-
subfolder-flatten-automator-quick-action/)

下に示したコマンドを実行しようと考えています。

[code]

    find . -mindepth 2 -type f -exec mv -i '{}' . ';'
    
[/code]

前半の `find . -mindepth 2 type f` はカレントディレクトリ内で、2階層までのファイルを検索し、後半の `-exec mv -i
'{}' . ';'` は検索したファイルをカレントディレクトリに移動している操作だと理解したのですが、後半の `{}` と `;` を `''`
で囲う意味がよく理解できません。

質問は以下の３つです。

  1. `{}` と `'{}'` は動作として異なるのか
  2. `;` と `';'` は動作として異なるのか
  3. `';'` と `\;` は同じ意味なのか

以上です。教えていただけると嬉しいです。よろしくお願いします。


CC BY-SA 4.0
2021-07-26T01:36:32.803
78399
2021-07-26T05:30:52.520
2021-07-26T05:30:52.520
3060
47427
question
macos zsh
find コマンドの -exec オプションで {} と ; を ' ' (シングルクォート) で囲う意味について


`{}` や `;` をクォート文字で囲むのは、それをそのまま`find`へのパラメーターとして渡すためです。  
これらの文字はシェルにとって意味のある文字だからです。

たとえば最後の `;` を

[code]

    find . -mindepth 2 -type f -exec mv -i '{}' . ;
    
[/code]

のように書いてしまうと、この `;` はシェルにとっての「コマンドの区切り」なので、`find`へのパラメーターとしては`. -mindepth 2
-type f -exec mv -i {} .`しか渡されないことになってしまいます。

`\;` も `;` をコマンドの区切りではなくただの文字としてエスケープするもので、意味は `';'` と同じです。


CC BY-SA 4.0
2021-07-26T03:03:56.827
78401
2021-07-26T03:03:56.827
45045
78399
answer


[man find](https://linuxjm.osdn.jp/html/GNU_findutils/man1/find.1.html) によると
`{` や `}` や `;` は シェルにとって特別な文字なので `find` を起動しようとしたシェル (`bash` とか `zsh` とか
`dash` とか) が先に処理してしまい `find` に渡されないから、適切にエスケープしないといけないよとあります。オイラの知る posix
shell すべてで `;` は複文の意味になるので `;\` または `';'` と書く必要があります。

では `{}` のほうはどうかというと `{}` だけではシェルの特殊処理が起動されないので `find` の引数としては `'{}'`
と書かなくてもいいことになっています。 `${PS1}` のように書くと環境変数の展開になるのですが。

`find` が見つけたファイル名にスペースが入っているとき `find . -exec mv {} .. \;` と書いたなら、ファイル名 `a
qucik brown fox` に対して `mv a quick brown fox ..` のように展開されてしまうと、ファイル名 `a quick
brown fox` がシェルによって `a` と `quick` と `brown` と `fox`
に分割されてしまいそうに見えます。が、やはりオイラの知る限りの `find` は `{}` の結果（に空白類が含まれていても）１つの `argv`
として渡してきます。なのでやはり `{}` を `'{}'` と書かなくてもよいようです。

が、まあ超絶古い商用 UNIX では `find` がバグっているかもしれないので安全のために `'{}'`
と書きたがる人がいたような気がしなくもないっス。ウチの hpux11.11 の `/usr/bin/find`
でも問題ないので今どき気にするほどのことは無さそうです。


CC BY-SA 4.0
2021-07-26T04:50:55.680
78405
2021-07-26T04:50:55.680
8589
78399
answer