chmodをインタラクティブにする1行のコマンドはありますか?


24

私は次のようなものを探しています:

ls | ask_yes_no_for_each_file | chmod +x the_files_approved

または同様の構文。

また、個別の確認が必要な他のコマンドでも機能する可能性があります。

回答:


45

これはあなたが探していることをします:

find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x

これは、使用するfindのではなくls、一般的に、ための解析ls出力は信頼できませんfindただし、を使用するこの形式は、改行やその他の難しい文字が含まれている場合でもファイル名で機能します。

説明

  • find . -maxdepth 1 -type f -print0

    これにより、ファイルが選択されます。これは、findの多くのオプションのいずれかを使用してカスタマイズできます。このオプションprint0find、ファイル名をヌル区切りリストで印刷するように指示します。これは、ファイル名のリストを送信する唯一の信頼できるものです。

  • xargs -L1 -p0 chmod +x

    これは、生成されたファイル名のヌル区切りリストをfind取得し、それらにコマンドを適用します。

この-L1オプションはxargs、一度に1つのファイル名のみを処理するように指示します。-pオプションは伝えxargs続ける前に、承認のためにプロンプトに。この-0オプションはxargs、ファイル名間の区切り文字としてヌル文字を使用するように指示します。

[ @kwanが指摘-pするxargsまで、私はこのオプションを知らなかった。]


あなたは作ることができますfind使用して、コマンドPOSIXの互換性-exec printf '%s\0' {} +。ただし、POSIX全体に互換性を持たせる方法はないと思います。
l0b0

この構文は私に警告を与えます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 ffind . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x
ハーベイ

@Harvey正解です。答えを更新して、その警告を削除しました。
John1024

25

を使用できますxargs

例えば:

ls|xargs -I path -p chmod +x path

オプション-p各コマンドラインを実行して端末から行を読み取るかどうかをユーザーに確認します。応答が「y」または「Y」で始まる場合にのみコマンドラインを実行します。


1
+1私はあなたの使用がxargs -pとても好きなので、それをコピーします。
John1024

1
パーフェクト!そして、ほとんどのコマンドをインタラクティブにする非常に簡単な方法。ありがとう。
ハーベイ


@Kroltan-なぜ誰もがファイル名に改行を使用するのでしょうか?
nbubis

1
@nbubisそれは起こる可能性があります:ターミナルに行き、タイプしtouch "a very long file name、Enterを押してください。行の継続を確認し、単に閉じ引用符を入力してEnterキーをもう一度押します。tadaa、ファイル名の改行。長いファイル名を再入力するための怠慢。
-Kroltan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.