如何將文件更改為目錄?find+mv 後文件失去
我有一個包含大約 2000 個文件的目錄。
我執行以下命令將這 2000 個文件移動到目標目錄中:
find /opt/alfresco \ -type f \( -iname \*.pdf -o -iname \*.xml \) \ -exec mv {} /opt/alfresco/archived/2020-01-07 \; > /opt/alfresco/scripts/move.log
但是,我忘了
/
在目標路徑的末尾附加 a 。所以上面的命令所做的是,它創建了一個帶有名稱的文件,2020-01-07
並向其中寫入了一些現在無法讀取的二進制內容。我的 2000 個文件不見了。該2020-01-07
文件的大小為 220 KB。但是這 2000 個文件的總大小約為 1 GB。有什麼辦法可以恢復這 2000 個文件嗎?或者我可以通過什麼方式將此文件轉換為我的數據返回
2020-01-07
的目錄?2020-01-07
在目標路徑的末尾添加一個斜杠
/opt/alfresco/archived/2020-01-07
會導致mv
命令錯誤,因為該2020-01-07
目錄顯然不存在。這將保存您的文件。如果它們是現有目錄(無論目標路徑末尾是否有斜杠),它們也將被保存
/opt/alfresco/archived/2020-01-07
,並且您的文件將被移動到該目錄中(文件名衝突可能仍然是一個問題,當您將文件從多個目錄移動到單個目錄中時)。這就是你想做的。您忘記做的是首先創建該目錄。現在,由於該目錄不存在,該
find
命令所做的就是獲取每個單獨的 XML 和 PDF 文件,將其重命名為/opt/alfresco/archived/2020-01-07
,然後繼續對下一個文件執行相同操作,覆蓋前一個文件。該文件
/opt/alfresco/archived/2020-01-07
現在是find
.另請注意,由於您在 中執行
find
命令/opt/alfresco
,因此該路徑下的任何 PDF 或 XML 文件,例如在 下的任何目錄中/opt/alfresco/archived
,都會遇到同樣的命運。這是一個很容易犯的錯誤。除了從備份中恢復失去的文件之外,沒有其他方便的方法可以恢復失去的文件。
如果您不每小時備份一次數據,這可能是開始考慮這樣做的好時機。我建議
restic
或borgbackup
用於備份個人文件,最好是針對某種異地或至少是外部儲存。以下問題和答案可能會有所幫助:
在您下次重寫此腳本時,您可能希望忽略
archived
子目錄,並使用mv -n -t
. 您還需要明確mv -v
),find
否則不會輸出它們的位置:find /opt/alfresco \ -path /opt/alfresco/archived -prune -o \ -type f \( -iname '*.pdf' -o -iname '*.xml' \) \ -exec mv -n -t /opt/alfresco/archived/2020-01-07 {} + \ -print >/opt/alfresco/scripts/move.log
評論中的一些事情(如下)可能有助於了解:
- 如果 GNU
mv
與 一起使用,如果不是目錄-t target
,它將失敗。target
您將使用-exec mv -t /opt/alfresco/archived/2020-01-07 {} +
一次移動多個文件find
(這也將加快操作速度)。- 如果 GNU
mv
與 一起使用-n
,它將拒絕覆蓋現有文件。- 既不是標準
-t
也不-n
是標準(儘管 macOS 和 FreeBSD 也有-n
),但這不應該阻止您在不需要在系統之間移植的腳本中使用它們。