web-dev-qa-db-ja.com

単一行で引用符で囲まれたファイル名を出力する方法は?

以下の方法でフォルダー内のアイテムのリストを出力したいと思います。

"filename1"  "filename2" "file name with spaces" "foldername" "folder name with spaces"

つまり、アイテム名は1行で、引用符(シングルまたはダブル)で囲み、スペースで区切る必要があります。

そんなこと知ってる

find . | xargs echo

出力を1行で出力しますが、各項目名を引用符で囲む方法がわかりません。

このコードはbshスクリプトの一部です。したがって、ソリューションは一連のコマンドであり、中間出力を格納するために一時ファイルを使用できます。

何か提案をありがとうございました。

乾杯、アナ

31
Ana

これはうまくいくはずです

find $PWD | sed 's/^/"/g' | sed 's/$/"/g' | tr '\n' ' '

編集:

これは前のものより効率的です。

find $PWD | sed -e 's/^/"/g' -e 's/$/"/g' | tr '\n' ' '

@Timofeyのソリューションは、最終的にtrで動作し、最も効率的です。

find $PWD -exec echo -n '"{}" ' \; | tr '\n' ' '
22
freethinker

次のように、find "-printf"を使用してsimlpyを実行することもできます。

find . -printf "\"%p\" " | xargs your_command

どこ:

          %p     File's name.

これにより、見つかったすべてのファイルが引用符で囲まれ、各アイテムがスペースで区切られます。これにより、複数のコマンドの使用が回避されます。

33
Benjamin A.

これを試して。

find . -exec echo -n '"{}" ' \;
15
Timofey Stolbov

GNU lsオプション--quoting-styleを使用すると、目的を簡単に取得できます。マニュアルページから:

--quoting-style=Word

エントリ名には引用スタイルWordを使用します:literallocaleShellShell-alwaysShell-escapeShell-escape-alwayscescape

たとえば、コマンドls --quoting-style=Shell-escape-alwaysを使用すると、出力は次のようになります。

'filename1' 'filename2' 'file name with spaces' 'foldername' 'folder name with spaces'

--quoting-style=cを使用すると、目的の例を正確に再現できます。ただし、出力がシェルスクリプトで使用される場合は、Shell-escape-alwaysなどの特殊文字を正しくエスケープする形式の1つを使用する必要があります。

13
George Hilliard

編集:
次の回答では、1行ではなく、改行区切りのLISTが生成されます。

  1. OPが他のコマンドを呼び出すために結果を使用していることを私は2番目に推測しています
  2. 出力LISTを1行に変換するのは簡単です(| tr '\n' ' '

あまり言及されていない方法は、xargs-d--delimiter)オプションを使用することです。

find . | xargs -I@ -d"\n" echo \"@\" 

-I@は各findの結果を@としてキャプチャし、引用符でエコーしました

これにより、引数に引用符を追加したのと同じように、任意のコマンドを呼び出すことができます。

$ find . | xargs -d"\n" testcli.js
[ "filename1",
  "filename2",
  "file name with spaces",
  "foldername",
  "folder name with spaces" ]

参照 https://stackoverflow.com/a/33528111/665507

2
leesei
for f in *; do printf "'%s' " "$f"; done; echo

または、 Gordon Davisson のおかげで:

printf "'%s' " *; echo

末尾のechoは、出力に改行を追加するだけです。

2
glenn jackman
    find . | sed "s|.*|\"&\"|"

簡単な説明:
。*パターンの結果を取り、引用符で囲みます。
良い情報源は sed です。

詳細説明:
パターン:s/one/ONE /

  • s置換コマンド。
  • /区切り文字。
    私の表現では、 "/"の代わりに "|"を使用して、パターンのような "山" s /.*/\"&\"/。
  • one正規表現パターン検索パターン。
  • [〜#〜] one [〜#〜]置換文字列。
  • 。*無制限に繰り返される記号を意味します。
  • \ ""自体を意味します。
  • 見つかったパターンに対応する特殊文字。
1
iosuser2332

試す

ls | sed -e 's/^/"/g' -e 's/$/"/g' | tr '\n' ' '
1
Ferroao