我有几个目录包含隐藏的空文件。我需要这些文件名本身的名称,所以我需要将文件名写入 txt 文件。我的脚本如下所示:
cd /z/all_vendors/
x=`find vendors -perm 755`
for FILE in $x; do
ls -a $FILE >> locator.txt
done
但是我得到了permission denied error
如何将这些隐藏文件名写入目录?
编辑供应商目录有以下子目录
vendors/
|__000123
|__000204
|__000404
因此x=`find vendors -perm 755`
找到具有特定权限的所有子目录
每个子目录均000xxx
具有以下树结构:
000xxx/
.
..
.kpypjn32rz6l
.66jwvo6x96sj
隐藏文件以点开头
我需要将隐藏文件的名称写入 txt 文件,例如“kpypjn32rz6l”
答案1
cd /z/all_vendors/ \
&& find vendors \
\( -type d ! -path vendors ! -perm 755 -prune \) -o \
\( -type f -name '.*' -exec basename -a -- {} + \) \
| sed 's/^\.//' >> locator.txt
笔记:
- 如果
cd
失败则find
不会执行。这是很好的做法。 - 任何不匹配的目录
-perm 755
都将被删除(即find
不会进入该目录),无论其深度如何。例如,如果您想不考虑权限而下降多个级别,并且只检查底层目录的权限,那么这可能是错误的。我知道您的目录结构非常扁平,所以这应该不是问题。! -path vendors
我保证不会被删除,无论其权限如何。(请注意,这对您提供的作为起点vendors
的路径非常敏感。需要;需要等。)find
find vendors/ …
! -path vendors/
find ./vendors …
! -path ./vendors
- 我假设你所说的“文件”是指“常规文件”,因此
-type f
。正式的“文件”是广义的术语。 basename
是一个便携式工具,但其-a
选项不可移植。如果您的basename
不支持,-a
请将其替换-exec basename -a -- {} +
为-exec basename -- {} \;
。- 希望要打印的文件名不包含任何换行符。换行符将终止名称。如果文件名可能包含换行符,标准方法是以空字符终止。以空字符终止会使我们的解决方案复杂化,并且不会产生
locator.txt
文本文件(POSIX 文本文件定义明确指出它不包含空字符)。 sed
每行删除一个前导点。- 如果来自不同目录的同名文件匹配,则会导致输出相同的行。
sort -u
如果要删除重复的行,请使用管道。