グラフィックIU(私の場合はmacOSのFinder)からファイルを選択するプログラムがあります。出力は次のとおりです
'/tmp/file number one.txt' '/tmp/file number two.txt'
名前に空白文字があるため、ファイル名は '(シングルストレートチェック)で囲まれます.
bashのコマンド置換(例えばls -l
コマンド)でこのコマンドの出力を使用すると、すべてが混乱します。テストのために、上記の行を単純な1行のテキストファイルに入れ、それをコマンドラインの代替手段として使用しました。
$ cat /tmp/files.txt
'/tmp/file number one.txt' '/tmp/file number two.txt'
$ ls -l $(</tmp/files.txt)
ls: "'/tmp/file: No such file or directory
ls: '/tmp/file: No such file or directory
ls: number: No such file or directory
ls: number: No such file or directory
ls: one.txt': No such file or directory
ls: two.txt'": No such file or directory
ファイル名文字列を変数に割り当てて使用する場合も同じことが起こります。
$ xxx="'/tmp/file number one.txt' '/tmp/file number two.txt'"
$ ls -l $xxx
ls: '/tmp/file: No such file or directory
ls: '/tmp/file: No such file or directory
ls: number: No such file or directory
ls: number: No such file or directory
ls: one.txt': No such file or directory
ls: two.txt': No such file or directory
この問題を解決する方法を知っていますか?エスケープされたファイル名をコマンドラインに直接コピーすると、期待どおりに機能します。
$ ls -l '/tmp/file number one.txt' '/tmp/file number two.txt'
-rw-r--r-- 1 tester wheel 0B Jul 17 17:21:11 2021 /tmp/file number one.txt
-rw-r--r-- 1 tester wheel 0B Jul 17 17:21:16 2021 /tmp/file number two.txt
私の究極の目標は、現在のFinderの選択(コンパイルされたApplescriptを介して得られた)をbashで使用できるようにすることです。たとえば、ls
ファイルリストやその他のファイル処理コンテンツを使用できます。tar
cp
mv
ベストアンサー1
遷移がオプションの場合は、zsh
この目的のために設計されたz
およびパラメータ拡張フラグを使用できます。Q
file_content=$(</tmp/files.txt)
quoted_strings=(${(z)file_content})
strings_with_one_layer_of_quotes_removed=("${(Q@)quoted_strings}")
ls -ld -- "$strings_with_one_layer_of_quotes_removed[@]"
または、一度にすべての作業を実行してください。
ls -ld -- "${(Q@)${(z)$(</tmp/files.txt)}}"
ファイルで参照されている構文が同じであるとしますzsh
。
Z
解析の実行方法を調整するには、パラメータの拡張も参照してください。たとえば、ファイルに#
無視する必要があるコメントが含まれていて、2行以上の場合は、次のことを行う必要があります。
ls -ld -- "${(Q@)${(Z[Cn])$(</tmp/files.txt)}}"
info zsh flags
詳細より。
zsh
¹今、最新バージョンのmacOSでは、デフォルトのインタラクティブシェルと聞きました。