簡體   English   中英

刪除目錄中的所有文件(不要觸摸任何文件夾或其中的任何內容)

[英]Remove all files in a directory (do not touch any folders or anything within them)

我想知道rm是否可以刪除目錄中的所有文件(但不刪除子文件夾或子文件夾中的文件)?

我知道有些人使用:

rm -f /direcname/*.*

但是這假定文件名有一個擴展而不是全部(我希望所有文件 - 有或沒有擴展名被刪除)。

雖然find允許您使用-exec rm {} \\;刪除文件-exec rm {} \\; 您可以使用

find /direcname -maxdepth 1 -type f -delete

它更快。 使用-delete意味着-depth選項,這意味着在目錄之前處理目錄內容。

find /direcname -maxdepth 1 -type f -exec rm {} \;

說明:

  • find內的文件搜索和目錄/direcname
  • -maxdepth將其限制為查找/direcname直接子項的文件和目錄
  • -type f將搜索限制為文件
  • -exec rm {} \\; 為每個文件運行命令rm {} (在替換文件的路徑代替{} )。

我想知道rm是否可以刪除目錄中的所有文件(但不刪除子文件夾或子文件夾中的文件)?

這很簡單:

$ rm folder/*

如果沒有-rrm命令將不會觸及子目錄或它們包含的文件。 這只會刪除文件folder中的文件,而不會刪除子目錄或其文件。

您將看到錯誤,告訴您文件夾/ foo是一個無法刪除的目錄,但這實際上對您沒問題。 如果要消除這些消息,只需重定向STDERR:

$ rm folder/* 2> /dev/null

順便說一句, rm命令的退出狀態可能不為零,因此您無法檢查rm是否有錯誤。 如果這很重要,你必須循環:

$ for file in *
> do
> [[ -f $file ]] && rm $file
> [[ $? -ne 0 ]] && echo "Error in removing file '$file'"
> done

即使文件名中包含空格,這也應該在BASH中工作。

您可以使用

find /direcname -maxdepth 1 -type f -exec rm -f {} \;

shell解決方案(沒有非標准的find -maxdepth)將是

for file in .* *; do
   test -f "$file" && rm "$file"
done

一些shell,特別是zsh和bash版本4(但不是版本3),有一個語法來做到這一點。

使用zsh,您可以輸入

rm /dir/path/*(.)

如果你想刪除名稱以foo開頭的任何文件,在子目錄中遞歸,你可以這樣做

rm /dir/path/**/foo*(.)

雙星特征是(與恕我直言更好的交互完成)在我看來足以切換到交互式shell的zsh。 因人而異

括號后綴中的圓點表示您只希望zsh shell擴展文件(不是符號鏈接或目錄)。

Unix不是DOS。 文件名中沒有特殊的“擴展名”字段。 點后面的任何字符只是名稱的一部分,稱為后綴。 可以有多個后綴,例如.tar.gz shell glob字符*匹配整個. 字符; 它沒有后綴。 所以MS-DOS *.*只是*在Unix中。

幾乎。 *與以a開頭的文件不匹配. 按慣例,以引導點命名的對象是“隱藏的”。 除非指定-a ,否則它們不會顯示在ls中。

(這意味着“self”和“parent”的...目錄條目被視為隱藏。)

要匹配隱藏的條目,請使用.*

rm命令不會刪除目錄(當不使用-r遞歸操作時)。 試試rm <directory>然后看看。 即使目錄為空,也會拒絕。

因此,從目錄中刪除所有(非隱藏)文件,管道,設備,套接字和符號鏈接(但保留子目錄)的方式實際上是:

rm /path/to/directory/*

還刪除隱藏的開頭.

rm /path/to/directory/{*,.*}

這個語法是大括號擴展。 支撐擴展不是模式匹配; 它只是生成多個參數的簡寫,在這種情況下:

rm /path/to/directory/* /path/to/directory/.*

首先進行此擴展,然后進行通配以生成要刪除的名稱。

請注意,此處發布的各種解決方案存在各種問

find /path/to/directory -type f -delete

# -delete is not Unix standard; GNU find extension
# without -maxdepth 1 this will recurse over all files
# -maxdepth is also a GNU extension
# -type f finds only files; so this neglects to delete symlinks, fifos, etc.

GNU查找解決方案的好處是,即使要刪除的目錄條目數量很大,它們仍然可以工作:太大而無法通過單次調用傳遞給rm 另一個好處是內置的-delete沒有將有趣的路徑名傳遞給外部命令的問題。

針對過多目錄條目問題的可移植解決方法是列出帶有lsxargs管道的條目:

( cd /path/to/directory ; ls -a | xargs rm -- )

括號表示“在子過程中執行這些命令”; 這樣就忘記了cd的效果,這在腳本編寫中很有用。 ls -a包含隱藏文件。

我們現在包括一個--rm之后意味着“這是最后一個選項;其他一切都是非選項參數”。 這可以保護我們免受名稱與選項無法區分的目錄條目的影響。 如果文件被調用-rf並結束第一個參數怎么辦? 然后你有rm -rf ...這將吹掉子目錄。

最簡單的方法是使用:

rm *

要刪除目錄,必須指定選項-r

rm -r

因此,您的目錄及其中包含的任何內容都不會被刪除

rm *

對於rm的手冊頁,其目的是刪除文件,這就是為什么這樣做的原因

簡單的shell globbing將:

% tree
.
├── 1
├── 2
├── 3
├── 4
├── 5
└── bar
    ├── a
    ├── b
    ├── c
    ├── d
    └── e

1 directory, 10 files

% rm -f *
rm: cannot remove ‘./bar’: Is a directory

% tree .
.
└── bar
    ├── a
    ├── b
    ├── c
    ├── d
    └── e

1 directory, 5 files

正如在Jens的回答中,您可能需要添加第二個rm -f .*但這只是在您希望主目錄中存在隱藏文件時。 無需檢查類型( test -f ),因為rm -f選項不會刪除目錄。 然而,這也將刪除“特殊”文件,例如符號鏈接和塊設備。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM