私がこのスクリプトでやりたいことは
- (デフォルトなし)ディレクトリ内の各ファイルの名前を読みます。
- 各ファイルに対して、ユーザーに作業(ディレクトリからファイルを移動するなど)を実行するかどうかを尋ねます。
操作を実行または実行しません。
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
ないため、エラーが発生します。read
signal 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 -c
find
n
"${pathname##*/}"
コードのビットは、最後のスラッシュまでのすべての項目を削除するのと同じです"$( basename "$pathname" )"
。$pathname
このfind
コマンドは次の役割を果たします。パス名ジェネレータfor
スクリプト内の-loopの場合、パスwhile
名またはファイル名を-loopにパイプする必要はありません。
関連: