Csh

如何檢查目錄中的每個文件並要求使用者在 csh shell 中執行操作

  • March 20, 2019

我想用這個腳本做的動作是

  1. 讀取目錄中每個文件的名稱(不含基)
  2. 對於每個文件,詢問使用者是否要執行操作(例如將文件移動到目錄中)
  3. 執行或不執行該操作。

我對 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" &gt;&2
       read answer
       case $answer in [Nn]*) continue; esac

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

這假定一個類似sh- 的 shell,並將生成sh -cfind. 內部 shell 腳本會詢問使用者是否願意處理每個單獨的路徑名。n如果使用者回答以(不區分大小寫)開頭的單詞,則將考慮下一個路徑名。

程式碼中的"${pathname##*/}"位等效於"$( basename "$pathname" )"它刪除$pathname了直到並包括最後一個斜杠的所有內容。

find命令充當內部腳本中-loop 的一種路徑名生成器,因此從不需要for管道路徑名或文件名到-loop。while

有關的:

引用自:https://unix.stackexchange.com/questions/461091