我應該編寫一個 shell 腳本,向其中發送一個代表目錄的命令列參數。然後我應該回顯該目錄中每個檔案的所有檔案名稱和行數。我還應該只對時間不超過 10 分鐘的前 10 個文件執行此操作。
find "$1" -cmin -10 -type f | head -10
這是我嘗試尋找更新時間超過 10 分鐘的文件的方法,但出現了一些錯誤。而且我也不知道該如何獲得這些名字。預先感謝您的所有幫助。
我的文件名是免費的。我得到的錯誤是,當將我的主目錄作為參數傳遞時,權限被拒絕。所以我沒有拿到名單。我應該獲取文件名列表和每個文件的行數。
當我/bin/bash ss1 /home/ivana
在終端機中輸入時,出現以下錯誤:
find: '/home/ivana/.cache/dconf': Permission denied
我正在使用Linux。
答案1
好的,首先要做的事。您得到的錯誤無關緊要,它只是意味著/home/ivana/.cache/dconf
您的特定子目錄 ( )$HOME
不屬於您。這幾乎肯定會發生,因為您使用sudo
.簡單的修復方法是:
sudo chown -R ivana /home/ivana/
這會將您後面的所有檔案和目錄的所有權變更$HOME
為您自己的使用者名稱。如果您可以擁有其他使用者正確擁有的內容,則只需更改目錄的所有權即可dconf
:
sudo chown -R ivana /home/ivana/.cache/dconf
現在,也就是說,正確執行此操作並處理任意檔名的方法是:
find "$1" -cmin -10 -type f -print0 | head -z -n 10
這將導致find
列印使用尾隨\0
而不是換行符號找到的每個文件,這確保它可以處理名稱包含換行符的文件。選項-z
使其head
讀取\0
分隔輸入。
下一步是讀取每個文件並列印它們的行數:
find "$1" -cmin -10 -type f -print0 | head -z -n 10 |
while IFS= read -r -d '' file; do wc -l "$file"; done
將IFS=
輸入欄位分隔符號設為空,使-r
不進行特殊read
處理\
(因此\t
不會成為製表符)並-d ''
告訴read
讀取\0
分隔資料。