如何将隐藏文件名复制到unix中的文本文件?

如何将隐藏文件名复制到unix中的文本文件?

我有几个目录包含隐藏的空文件。我需要这些文件名本身的名称,所以我需要将文件名写入 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的路径非常敏感。需要;需要等。)findfind vendors/ …! -path vendors/find ./vendors …! -path ./vendors
  • 我假设你所说的“文件”是指“常规文件”,因此-type f。正式的“文件”是广义的术语
  • basename是一个便携式工具,但其-a选项不可移植。如果您的basename不支持,-a请将其替换-exec basename -a -- {} +-exec basename -- {} \;
  • 希望要打印的文件名不包含任何换行符。换行符将终止名称。如果文件名可能包含换行符,标准方法是以空字符终止。以空字符终止会使我们的解决方案复杂化,并且不会产生locator.txt文本文件(POSIX 文本文件定义明确指出它不包含空字符)。
  • sed每行删除一个前导点。
  • 如果来自不同目录的同名文件匹配,则会导致输出相同的行。sort -u如果要删除重复的行,请使用管道。

相关内容