unix 查找目录中本身不是目录的所有文件

hgb9j2n6  于 2022-11-04  发布在  Unix
关注(0)|答案(8)|浏览(187)

我正在寻找一种方法来列出目录中的所有文件,不包括目录本身,以及这些子目录中的文件。
所以如果我有:

./test.log
./test2.log
./directory
./directory/file2

我需要一个返回以下内容的命令:./test.log ./test2.log,而不包含其他任何内容。

yftpprvb

yftpprvb1#

如果您需要test.logtest2.logfile2,则:

find . -type f

如果您不需要file2,则:

find . -maxdepth 1 -type f
mbskvtky

mbskvtky2#

如果您还需要列出符号链接、管道、设备文件和文件系统的其他特定元素,则应用途:

find -maxdepth 1 -not -type d

这将列出除目录以外的所有内容。

f4t66c6m

f4t66c6m3#

使用find很简单:

find . -maxdepth 1 -type f
eulz3vhy

eulz3vhy4#

find仅限常规文件

搭配find使用-type f选项,* 仅 * 寻找一般档案。或者,若要包含更多档案类型,请使用-not -type d寻找 * 除 * 目录以外的所有档案类型。
在列出所有文件时,我还喜欢按照sort -V的管道对它们进行排序,如下所示:


# find only regular files

find . -type f | sort -V

# even more-inclusive: find all file types _except_ directories

find . -not -type d | sort -V

man find开始:
-type c
文件的类型为c

  • b-块(缓冲)特殊
  • c-特殊字符(无缓冲)
  • d-目录
  • p-命名管道(FIFO)
  • f-常规文件
  • l-符号链接;如果-L选项或-follow选项有效,则不会出现这种情况,除非符号链接已断开。如果要在-L有效时搜索符号链接,请使用-xtype
  • s-插槽
  • D-门(Solaris)

要一次搜索多个类型,可以提供由逗号,(GNU扩展名)分隔的类型字母的组合列表。

如何将find(多行字符串文件列表)的输出存储到bash数组中

为了更进一步,下面介绍**如何将所有文件名存储到一个名为filenames_array**的bash索引数组中,以便您可以轻松地将它们传递给另一个命令:


# obtain a multi-line string of all filenames

filenames="$(find . -type f | sort -V)"

# read the multi-line string into a bash array

IFS=$'\n' read -r -d '' -a filenames_array <<< "$filenames"

# Now, the the variable `filenames_array` is a bash array which contains the list

# of all files! Each filename is a separate element in the array.

现在,您可以将整个文件名数组传递给另一个命令(例如echo),方法是使用"${filenames_array[@]}"一次获取数组中的所有元素,如下所示:

echo "${filenames_array[@]}"

或者,您可以像这样逐一查看数组中的每个元素:

echo "Files:"
for filename in "${filenames_array[@]}"; do
    echo "  $filename"
done

示例输出:

Files:
  ./file1.txt
  ./file2.txt
  ./file3.txt

参考文献:

1.我想起了the main answer by @John Kugelman here中的find . -type f
1.我借用了我自己的答案中的部分,将多行字符串读入bash数组:How to read a multi-line string into a regular bash "indexed" array

iq3niunx

iq3niunx6#

find /some/directory -type f
ekqde3dh

ekqde3dh7#

$ find . -type f -print

每个文件都在自己的行上。您必须在要搜索的目录中。

lawou6xi

lawou6xi8#

还有一个选择

ls -ltr | grep ^-

列出所有文件,而

ls -ltr | grep ^d

列出所有目录

相关问题