我有一个包含大量文件的目录。我想删除除 file.txt 之外的所有文件。我该怎么做呢?
有太多文件无法单独删除不需要的文件,而且它们的名称过于多样化,无法使用 * 将它们全部删除,除了这个文件。
有人建议使用
rm !(file.txt)
Run Code Online (Sandbox Code Playgroud)
但它不起作用。它返回:
Badly placed ()'s
Run Code Online (Sandbox Code Playgroud)
我的操作系统是 Scientific Linux 6。
有任何想法吗?
cuo*_*glm 385
POSIXly:
find . ! -name 'file.txt' -type f -exec rm -f {} +
Run Code Online (Sandbox Code Playgroud)
将删除所有常规文件(递归,包括隐藏文件),除了file.txt. 要删除目录,请更改-type f为-type d并将-r选项添加到rm.
在 中bash,要使用rm -- !(file.txt),您必须启用 extglob:
$ shopt -s extglob
$ rm -- !(file.txt)
Run Code Online (Sandbox Code Playgroud)
(或打电话bash -O extglob)
请注意,extglob仅适用于bash和 Korn shell 系列。并且使用rm -- !(file.txt)会导致Argument list too long错误。
在 中zsh,您可以使用启用extendedglob^来否定模式:
$ setopt extendedglob
$ rm -- ^file.txt
Run Code Online (Sandbox Code Playgroud)
或使用相同的语法ksh和bash选项ksh_glob并no_bare_glob_qual启用。
Seb*_*ian 164
另一个不同的方向(如果文件名中没有空格)
ls | grep -v file.txt | xargs rm
Run Code Online (Sandbox Code Playgroud)
或(即使文件名中有空格也能工作)
ls | grep -v file.txt | parallel rm
Run Code Online (Sandbox Code Playgroud)
来自man grep:
-v, --invert-match
Invert the sense of matching, to select non-matching lines. (-v is specified by POSIX)
Run Code Online (Sandbox Code Playgroud)
mik*_*erv 42
维护副本,删除所有内容,恢复副本:
{ rm -rf *
tar -x
} <<TAR
$(tar -c $one_file)
TAR
Run Code Online (Sandbox Code Playgroud)
在一行中:
{ rm -rf *; tar -x; } <<< $(tar -c $one_file)
Run Code Online (Sandbox Code Playgroud)
但这需要一个支持 here-strings 的 shell。
Sha*_*dur 33
你们都想多了。
cd ..
mv fulldir/file.txt /tmp/
rm -rf fulldir
mkdir fulldir
mv /tmp/file.txt fulldir/
Run Code Online (Sandbox Code Playgroud)
完毕。
编辑实际上,更容易:
cd ..
ln fulldir/file.txt ./
rm -rf fulldir
mkdir -p fulldir
mv file.txt fulldir/
Run Code Online (Sandbox Code Playgroud)
Kan*_*ura 21
在我的 Scientific Linux 6 操作系统上,这有效:
shopt -s extglob
rm !(file.txt)
Run Code Online (Sandbox Code Playgroud)
我还在虚拟机上安装了 Debian 32 位。以上不起作用,但以下起作用:
find . -type f ! -name 'file.txt' -delete
Run Code Online (Sandbox Code Playgroud)
小智 12
使用rm !("file.txt")代替rm !(file.txt)
只是为了给出不同的答案,您可以使用rm它不会删除文件夹的默认行为:
mkdir tmp && mv file.txt tmp # create tmp dir and move files there
rm # delete all other files
mv tmp/* . && rm -rf tmp # move all files back and delete tmp dir
Run Code Online (Sandbox Code Playgroud)
我发现这种方法非常简单、有效,并且不需要任何特殊的扩展(我知道!)
ls --hide=file.txt | xargs -d '\n' rm
Run Code Online (Sandbox Code Playgroud)