ディレクトリ内のすべてのファイルを確認し、ユーザーにcshシェルでアクションを実行するように依頼する方法

ディレクトリ内のすべてのファイルを確認し、ユーザーにcshシェルでアクションを実行するように依頼する方法

私がこのスクリプトでやりたいことは

  1. (デフォルトなし)ディレクトリ内の各ファイルの名前を読みます。
  2. 各ファイルに対して、ユーザーに作業(ディレクトリからファイルを移動するなど)を実行するかどうかを尋ねます。
  3. 操作を実行または実行しません。

    whileループと入力の読み込みに問題があります。私はこれを試しました:

    #! /bin/csh -f set DIR = 'pwd' find $DIR -name * -exec basename {}\| while read filename do read -p $filename" (y または n?)" 選択 if ($choice = "y") 次の <> endif end

しかし、エラーが発生します。

find: `basename' terminated by signal 13.

また、「はい」または「いいえ」が表示されるまで、ユーザー入力を拡張するために一定期間を再利用することも検討していますが、これは二次的な問題です。

答え1

bash-line仕様を使用しても、#!シェルコードの一部はコードのように見えますcsh。コマンドがcshないため、エラーが発生します。readsignal 13

シグナル 13 は PIPE シグナルで、デッドパイプ (誰も反対側で未読パイプ) に書き込もうとするとプロセスに送信されます。readループ呼び出しが失敗したため、パイプは機能しませんwhile。にあったので失敗しましたcsh

もし cshコマンドがある場合、readループはファイル名を取得しますが、それを知る方法はありません。どここれらのファイル名はディレクトリパスを削除したため、そのサブディレクトリに属します。したがって、あなたはそれらで多くのことをすることはできません。


これ最も単純なこれを行う方法は、findユーザーに質問することです。

find . -type f -ok some-action '{}' ';'

some-actionパス名を引数として使用してユーティリティを実行する前に、各パス名を解決する必要があります。与えられたパス名に対して実行されるコマンドライン全体を要求するので、それはまったく必要ではありません。

また、指定すると-type fすべての一般ファイルを検索しますが、-name '*'テストではいつもディレクトリを含むあらゆる種類のファイルで動作します。また.、(現在のディレクトリ)を最上位のディレクトリとして使用しましたが、これは変数を使用して実行したい作業findのようです。DIR

パス名を正しく処理しながら、ユーザーに各ファイルを入力するように手動で要求する最も簡単な方法は、次のことです。

find . -type f -exec sh -c '
    for pathname do
        printf "process %s (%s)?\n" "${pathname##*/}" "$pathname" >&2
        read answer
        case $answer in [Nn]*) continue; esac

        printf "processing %s...\n" "$pathname" >&2
        # process "$pathname" here
    done' sh {} +

これは、同様のシェルを想定してから見つかったパス名のバッチをsh生成します。内部シェルスクリプトは、ユーザーに個々のパス名を処理するかどうかを尋ねます。ユーザーが(大文字と小文字を区別しない)で始まる単語で応答すると、次のパス名が考慮されます。sh -cfindn

"${pathname##*/}"コードのビットは、最後のスラッシュまでのすべての項目を削除するのと同じです"$( basename "$pathname" )"$pathname

このfindコマンドは次の役割を果たします。パス名ジェネレータforスクリプト内の-loopの場合、パスwhile名またはファイル名を-loopにパイプする必要はありません。

関連:

関連情報