回答:
これはあなたが探していることをします:
find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x
これは、使用するfind
のではなくls
、一般的に、ための解析ls
出力は信頼できません。find
ただし、を使用するこの形式は、改行やその他の難しい文字が含まれている場合でもファイル名で機能します。
説明
find . -maxdepth 1 -type f -print0
これにより、ファイルが選択されます。これは、findの多くのオプションのいずれかを使用してカスタマイズできます。このオプションprint0
はfind
、ファイル名をヌル区切りリストで印刷するように指示します。これは、ファイル名のリストを送信する唯一の信頼できるものです。
xargs -L1 -p0 chmod +x
これは、生成されたファイル名のヌル区切りリストをfind
取得し、それらにコマンドを適用します。
この-L1
オプションはxargs
、一度に1つのファイル名のみを処理するように指示します。-p
オプションは伝えxargs
続ける前に、承認のためにプロンプトに。この-0
オプションはxargs
、ファイル名間の区切り文字としてヌル文字を使用するように指示します。
[ @kwanが指摘-p
するxargs
まで、私はこのオプションを知らなかった。]
find: warning: you have specified the -maxdepth option after a non-option argument -type, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.
ので、次のように-maxdepth 1
前に動作します-type f
:find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x
を使用できますxargs
。
例えば:
ls|xargs -I path -p chmod +x path
オプション-p
: 各コマンドラインを実行して端末から行を読み取るかどうかをユーザーに確認します。応答が「y」または「Y」で始まる場合にのみコマンドラインを実行します。
xargs -p
とても好きなので、それをコピーします。
touch "a very long file name
、Enterを押してください。行の継続を確認し、単に閉じ引用符を入力してEnterキーをもう一度押します。tadaa、ファイル名の改行。長いファイル名を再入力するための怠慢。
find
使用して、コマンドPOSIXの互換性-exec printf '%s\0' {} +
。ただし、POSIX全体に互換性を持たせる方法はないと思います。