Linux

如何將文件更改為目錄?find+mv 後文件失去

  • January 8, 2020

我有一個包含大約 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,都會遇到同樣的命運。

這是一個很容易犯的錯誤。除了從備份中恢復失去的文件之外,沒有其他方便的方法可以恢復失去的文件。

如果您不每小時備份一次數據,這可能是開始考慮這樣做的好時機。我建議resticborgbackup用於備份個人文件,最好是針對某種異地或至少是外部儲存。

以下問題和答案可能會有所幫助:

在您下次重寫此腳本時,您可能希望忽略archived子目錄,並使用mv -n -t. 您還需要明確-print找到的文件(或使用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

評論中的一些事情(如下)可能有助於了解:

  • 如果 GNUmv與 一起使用,如果不是目錄-t target,它將失敗。target您將使用-exec mv -t /opt/alfresco/archived/2020-01-07 {} +一次移動多個文件find(這也將加快操作速度)。
  • 如果 GNUmv與 一起使用-n,它將拒絕覆蓋現有文件。
  • 既不是標準-t也不-n是標準(儘管 macOS 和 FreeBSD 也有-n),但這不應該阻止您在不需要在系統之間移植的腳本中使用它們。

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