这个问题的灵感来自
我看到这些结构
for file in `find . -type f -name ...`; do smth with ${file}; done
Run Code Online (Sandbox Code Playgroud)
和
for dir in $(find . -type d -name ...); do smth with ${dir}; done
Run Code Online (Sandbox Code Playgroud)
几乎每天都在这里使用,即使有些人花时间对这些帖子发表评论,解释为什么应该避免这种东西......
看到此类帖子的数量(以及有时这些评论被简单地忽略的事实)我想我还不如问一个问题:
为什么循环find
的输出是不好的做法,为 返回的每个文件名/路径运行一个或多个命令的正确方法是find
什么?
我想设置一个目录,其中所有新文件和目录都具有特定的访问掩码,并且目录还设置了粘滞位(t
限制删除这些目录中的文件的那个)。
对于第一部分,我的理解是我需要为父目录设置默认ACL。但是,新目录不会t
从父目录继承该位。因此,非所有者可以删除子目录中的文件。我能解决这个问题吗?
在某些情况下,'find'、'bash' 和 'sed' 看起来不像人们预期的那样工作。
下面的例子应该首先创建文件'sample.txt',然后找到该文件,最后通过'-exec'命令处理它。执行的命令打印找到的文件名、测试样本和修改后的文件名。'sed' 命令本身用于将 'txt' 替换为 'TXT'。
touch sample.txt
find ./ -maxdepth 1 -name "*.txt" -exec echo {} $(echo Specimen_before.txt {} Specimen_after.txt |sed -e "s/txt/TXT/g") \;
Run Code Online (Sandbox Code Playgroud)
预期的输出是:
./sample.txt Specimen_before.TXT ./sample.TXT Specimen_after.TXT
相反,它产生:
./sample.txt Specimen_before.TXT ./sample.txt Specimen_after.TXT
(该示例还通过反引号 '`' 使用老式命令替换进行了测试,结果相同)
我究竟做错了什么?