我想删除主目录的所有子目录中具有给定名称的所有文件。
我试过:
rm -r file
Run Code Online (Sandbox Code Playgroud)
在我的主目录中,但它不起作用,因为该目录中不存在该文件。
我解压了一个损坏的 tar 文件,并设法得到了一些我无法删除的目录,如果我尝试删除它,似乎找不到ls
它,但显示它存在,无论是使用 bash 还是使用 python 我得到类似的行为,除了在我尝试用 删除它之后rm -rf
, ls
抱怨它找不到它,然后它列出它(见下文rm -rf
)。该find
命令显示文件存在,但我仍然想不出删除它的方法。
这是我的尝试:
在这里你看到了两者ls
并find
同意我们有一个目录,
rl]$ ls
mikeaâ??cnt
rl]$ find -maxdepth 1 -type d -empty -print0
./mikeaâcnt
Run Code Online (Sandbox Code Playgroud)
但我无法删除它:
rl]$ find -maxdepth 1 -type d -empty -print0 | xargs -0 rm -f -v
rm: cannot remove `./mikeaâ\302\201\302\204cnt': Is a directory
rl]$ ls
mikeaâ??cnt
Run Code Online (Sandbox Code Playgroud)
我可以cd
,但它是空的:
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ pwd
.../rl/mikeaâcnt
mikeaâ^Á^Äcnt]$ cd ../
rl]$ ls
mikeaâ??cnt …
Run Code Online (Sandbox Code Playgroud) 我按照指定的顺序运行了以下命令:
$ln a b
$ls -i a b
523669 a 523669 b
$rm -f a
$ls -i b
523669 b
Run Code Online (Sandbox Code Playgroud)
我从这个测试中得出结论,该命令rm
实际上只删除了文件名(a
在这个测试中)而不是文件,因为 inode 仍然存在并且可以通过另一个文件名 ( b
)检索。
我的问题是,如果一个文件只硬链接到一个文件名,那么当rm
对文件执行时,真正的文件(即inode)是否被完全删除?如果没有,是否可以在没有文件名的情况下仅通过 inode 检索文件 inode?
我有一个通过 LUKS 加密的外部硬盘驱动器。它包含一个 ext4 fs。
我刚刚从 rsync 收到一个错误,用于位于此驱动器上的文件:
rsync: readlink_stat("/home/some/dir/items.json") failed: Structure needs cleaning (117)
Run Code Online (Sandbox Code Playgroud)
如果我尝试删除该文件,则会出现相同的错误:
rm /home/some/dir/items.json
rm: cannot remove ‘//home/some/dir/items.json’: Structure needs cleaning
Run Code Online (Sandbox Code Playgroud)
有谁知道我可以做些什么来删除文件并修复驱动器/文件系统的相关问题(如果有的话)?
假设我想删除文件夹中大于 1 MB 的所有文件。
$ find . -size +1M | xargs -0 rm
Run Code Online (Sandbox Code Playgroud)
这不会删除名称中有空格的文件。所以我希望它引用它发送到的所有参数rm
。如果find
给它Some report.docx
它应该传递"Some report.docx"
给rm
.
我怎样才能做到这一点?
经典情况:我跑得不好rm
,之后立即意识到我删除了错误的文件。(没什么重要的,我最近的备份还算可以,但还是很烦人。)
知道如果我想使用extundelete
或此类工具恢复文件,进一步的磁盘活动是我的敌人,我立即关闭了机器的物理电源(即,使用电源按钮,而不是使用halt
或任何此类命令)。这是一台没有运行重要任务或任何打开的笔记本电脑,所以这是一个可以接受的操作。(顺便说一下,从那时起我了解到在这种情况下要做的第一件事是首先估计丢失的文件是否仍然可以被进程打开https://unix.stackexchange.com/a/101247 --如果是,您应该通过这种方式恢复它们,而不是关闭机器。)
尽管如此,一旦机器断电,我想了一会儿,并认为这些文件不值得花时间启动实时系统进行适当的取证。所以我重新启动了机器。然后我发现我的文件仍然位于磁盘上:rm
在我关闭电源之前还没有传播到磁盘。我跳了一小段舞,感谢系统管理员之神出人意料的宽恕。
我现在的问题是要了解这是如何可能的,以及rm
实际传播到磁盘之前的典型延迟是多少。我知道磁盘 IO 不会立即刷新,而是在内存中停留了一段时间,但我认为磁盘日志会很快确保挂起的操作不会完全丢失。https://unix.stackexchange.com/a/78766似乎暗示了一种单独的机制来刷新脏页和刷新日志操作,但没有提供足够的细节来说明日志将如何参与 arm
以及之前的预期延迟操作被刷新。
更多细节:数据位于 LUKS 卷内的 ext4 分区中,在启动机器备份时,我看到以下内容syslog
:
Sep 24 10:24:58 gamma kernel: [ 11.457007] EXT4-fs (dm-0): 1 orphan inode deleted
Sep 24 10:24:58 gamma kernel: [ 11.458393] EXT4-fs (dm-0): recovery complete
Sep 24 10:24:58 gamma kernel: [ 11.482475] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null)
Run Code Online (Sandbox Code Playgroud)
但我不相信它与rm
.
另一个问题是是否有办法告诉内核不要执行任何挂起的磁盘操作(而是将它们转储到某处),而不是关闭机器电源。(当然,不执行挂起的操作听起来很危险,但这就是在关闭机器电源时会发生的情况,并且在某些情况下它可以拯救您。)当然,这将是“更干净”,也很有趣例如,对于物理断电不是一个简单选择的远程服务器。
是否有一些操作顺序rm
?我rm
在一个大目录上执行,并且很好奇我应该在哪里查看可能已删除的内容。是否先rm
处理文件,然后处理目录?还是基于inode表中的一些信息?
规格:来自 GNU coreutils 8.22 系统的 rm:在 beagleboneblack 文件系统上运行的 Arch Linux 是使用 USB 2.0 的外部 Seagate HDD (ext4)。
背景故事:
我正在执行一些目录清理并执行
cp -r A/ B/ C/ Dest/
Run Code Online (Sandbox Code Playgroud)
不知不觉中,我跟进了
rm -r A/ B/ C/ Dest/
Run Code Online (Sandbox Code Playgroud)
当我想简单地表演时
rm -r A/ B/ C/
Run Code Online (Sandbox Code Playgroud)
我抓住了这个并在不久之后点击了Ctrl+ C。具体来说,当我将time
命令与rm
&结合使用时,它是 < 3 秒cp
。我进去检查,Dest/
以为它不存在,但你瞧,它是完整的,似乎没有受到影响。这有点令人惊讶,因为它A/
B/
C/
很小。总共可能 100–200 MB。Dest/
然而,仅差 1TB。执行ls
on Dest/ 表明在字母表的两端都有文件和目录(例如AFile.txt
.... .... Zoo.txt …
从未想过这会发生在我身上,但你去了。 ¯\_(?)_/¯
我从错误目录中的存储库中运行了一个构建脚本,而没有先查看源代码。这是脚本Scripts/BuildLocalWheelLinux.sh
:
cd ../Dependencies/cpython
mkdir debug
cd debug
../configure --with-pydebug --enable-shared
make
cd ../../..
cd ..
mkdir -p cmake-build-local
cd cmake-build-local
rm -rf *
cmake .. -DMVDIST_ONLY=True -DMVPY_VERSION=0 -DMVDPG_VERSION=local_build
make -j
cd ..
cd Distribution
python3 BuildPythonWheel.py ../cmake-build-local/[redacted]/core.so 0
python3 -m ensurepip
python3 -m pip install --upgrade pip
[more pip install stuff]
python3 -m setup bdist_wheel --plat-name manylinux1_x86_64 --dist-dir ../dist
cd ..
cd Scripts
Run Code Online (Sandbox Code Playgroud)
危险的部分似乎是
mkdir -p cmake-build-local
cd cmake-build-local
rm -rf *
Run Code Online (Sandbox Code Playgroud)
不过仔细一想,好像也不会出错。
您应该运行此脚本的方式是cd Scripts; …
我有 2 个文件的目录考试。我需要删除文件但权限被拒绝。即使rm -rf
命令也无法删除这些文件。我以 root 用户身份登录。
使用rm -rf LargeDirectory
删除大目录可能需要很长时间才能完成,具体取决于目录的大小。
是否有可能获得状态更新或以某种方式监视此删除的进度以粗略估计命令在过程中的位置?
rm ×10
files ×3
directory ×2
shell ×2
bash ×1
ext4 ×1
filesystems ×1
find ×1
hard-link ×1
inode ×1
journaling ×1
linux ×1
linux-kernel ×1
nfs ×1
permissions ×1
quoting ×1
recursive ×1
shell-script ×1
ubuntu ×1
xargs ×1
zsh ×1