![](/img/trans.png)
[英]Linux: Find all folders with a particular name, remove them and have a folder copied into the parent directory of those folders
[英]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/*
如果沒有-r
, rm
命令將不會觸及子目錄或它們包含的文件。 這只會刪除文件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
沒有將有趣的路徑名傳遞給外部命令的問題。
針對過多目錄條目問題的可移植解決方法是列出帶有ls
和xargs
管道的條目:
( 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.