如何檢查目錄中的每個文件並要求使用者在 csh shell 中執行操作
我想用這個腳本做的動作是
- 讀取目錄中每個文件的名稱(不含基)
- 對於每個文件,詢問使用者是否要執行操作(例如將文件移動到目錄中)
- 執行或不執行該操作。
我對 while 循環和讀取輸入有疑問。我試過這個:
#!/bin/csh -f 設置 DIR = ‘pwd’ 查找 $ DIR -name * -exec basename {} ; | while read filename do read -p $ filename" (y or n?)" 選擇 if ($choice = “y”) then <> endif end
但我得到了錯誤:
find: `basename' terminated by signal 13.
我還在考慮再次使用一段時間來擴展使用者的輸入,直到給出是或否,但這是一個二階問題。
bash
即使您使用-line#!
指定csh
.csh
沒有read
命令,這就是您收到signal 13
錯誤的原因。信號 13 是 PIPE 信號,當它試圖寫入死管道(沒有人從另一端讀取的管道)時,它被發送到程序。管道已死,因為在-loop中
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
- 的 shell,並將生成sh -c
由find
. 內部 shell 腳本會詢問使用者是否願意處理每個單獨的路徑名。n
如果使用者回答以(不區分大小寫)開頭的單詞,則將考慮下一個路徑名。程式碼中的
"${pathname##*/}"
位等效於"$( basename "$pathname" )"
它刪除$pathname
了直到並包括最後一個斜杠的所有內容。該
find
命令充當內部腳本中-loop 的一種路徑名生成器,因此從不需要for
管道路徑名或文件名到-loop。while
有關的: