多个执行命令以查找并在同一行中提供输出
multiple execute command for find and provide output in same line
我正在尝试制作单行 bash 脚本来收集文件 name/location、文件大小和文件类型。我设法使用以下脚本做了同样的事情:
find . -type f -exec du {} \; -exec file -b {} \;
然而,它的输出分为两行:
0 /usr/local/lib/python2.7/lib-tk/test/test_tkinter/__init__.py
empty
我要显示的是单行,格式如下:
0 /usr/local/lib/python2.7/lib-tk/test/test_tkinter/__init__.py
empty
size : file name : file type
谁能指导一下吗?
这可能对你有用。请参阅下面的注释以及假设和解释。
$ find so -type f -exec du {} \; -exec file -b {} \; | awk -F\t 'NF > 1 { printf "%s:%s:", , ; next }1'
8:so/a.txt:ASCII text
8:so/anotherfile.txt:ASCII text
8:so/b1.txt:ASCII text
8:so/b2.txt:ASCII text
8:so/input.txt:ASCII text
8:so/long.txt:ASCII text, with very long lines
8:so/ref.txt:ASCII text
63504:so/somezip.zip:Zip archive data, at least v1.0 to extract
8:so/this.is.a.file.txt:ASCII text
8:so/yet-still-another-file.txt:ASCII text
备注
awk -F\t
将查找结果通过管道传输到 awk 中,使用制表符作为分隔符。在这里,我假设 du
命令像在我的环境中一样使用制表符将大小与文件分开。
NF > 1
如果有多个字段,我们知道它是 du
输出(这里我假设 file
返回的类型中有 none 包含制表符)。
{ printf "%s:%s:", , ; next }
打印带有冒号分隔符的 du
输出,并且 没有 尾随换行符。 next
告诉它立即跳到下一行输入(file
输出)。
1
简单地将输入(即 file
输出)打印到带有换行符的标准输出的惯用方式。 (1
是模式,始终为真,默认操作是打印该行。)
find -type f -exec sh -c 'du {};echo -n size:$(du --summarize --human-readable "{}"|cut -f1)" ";echo -n filname:$(basename "{}");echo " "filetype:$(file -b "{}")' \;
您是否看过 find
手册页中的 -printf
参数?
$ ls -al
total 65
drwxr-xr-x+ 1 Ed None 0 Feb 10 19:38 .
drwxr-xr-x+ 1 Ed None 0 Feb 9 08:41 ..
-rw-r--r-- 1 Ed None 2 Feb 10 19:40 a
-rw-r--r-- 1 Ed None 0 Feb 10 19:38 b
$ find . -printf "%s : %p : %y\n"
0 : . : d
2 : ./a : f
0 : ./b : f
这里结合了 Ed 的方法,但附加了 file -b
的输出。它似乎对我有用:
find . -type f -printf "%b : %p : " -exec file -b {} \;
%b
格式化程序位于 512 个块中,这是我在系统文件上看到的 运行 du
。对于 1024K 块,您可能更喜欢 %k
或者 Ed 展示的 %s
。 %p
格式化程序输出完整的文件名。在 printf
格式化程序中没有给输出一个回车符 return 然后 exec 发生。我找不到提供 file -b
功能的格式化程序。
例如:
find . -type f -printf "%b : %p : " -exec file -b {} \;
8 : ./data : ASCII text
8 : ./awko : data
0 : ./nothing : empty
8 : ./data2 : ASCII text
这是我使用的 find man page 的 link。
我正在尝试制作单行 bash 脚本来收集文件 name/location、文件大小和文件类型。我设法使用以下脚本做了同样的事情:
find . -type f -exec du {} \; -exec file -b {} \;
然而,它的输出分为两行:
0 /usr/local/lib/python2.7/lib-tk/test/test_tkinter/__init__.py
empty
我要显示的是单行,格式如下:
0 /usr/local/lib/python2.7/lib-tk/test/test_tkinter/__init__.py
empty
size : file name : file type
谁能指导一下吗?
这可能对你有用。请参阅下面的注释以及假设和解释。
$ find so -type f -exec du {} \; -exec file -b {} \; | awk -F\t 'NF > 1 { printf "%s:%s:", , ; next }1'
8:so/a.txt:ASCII text
8:so/anotherfile.txt:ASCII text
8:so/b1.txt:ASCII text
8:so/b2.txt:ASCII text
8:so/input.txt:ASCII text
8:so/long.txt:ASCII text, with very long lines
8:so/ref.txt:ASCII text
63504:so/somezip.zip:Zip archive data, at least v1.0 to extract
8:so/this.is.a.file.txt:ASCII text
8:so/yet-still-another-file.txt:ASCII text
备注
awk -F\t
将查找结果通过管道传输到 awk 中,使用制表符作为分隔符。在这里,我假设 du
命令像在我的环境中一样使用制表符将大小与文件分开。
NF > 1
如果有多个字段,我们知道它是 du
输出(这里我假设 file
返回的类型中有 none 包含制表符)。
{ printf "%s:%s:", , ; next }
打印带有冒号分隔符的 du
输出,并且 没有 尾随换行符。 next
告诉它立即跳到下一行输入(file
输出)。
1
简单地将输入(即 file
输出)打印到带有换行符的标准输出的惯用方式。 (1
是模式,始终为真,默认操作是打印该行。)
find -type f -exec sh -c 'du {};echo -n size:$(du --summarize --human-readable "{}"|cut -f1)" ";echo -n filname:$(basename "{}");echo " "filetype:$(file -b "{}")' \;
您是否看过 find
手册页中的 -printf
参数?
$ ls -al
total 65
drwxr-xr-x+ 1 Ed None 0 Feb 10 19:38 .
drwxr-xr-x+ 1 Ed None 0 Feb 9 08:41 ..
-rw-r--r-- 1 Ed None 2 Feb 10 19:40 a
-rw-r--r-- 1 Ed None 0 Feb 10 19:38 b
$ find . -printf "%s : %p : %y\n"
0 : . : d
2 : ./a : f
0 : ./b : f
这里结合了 Ed 的方法,但附加了 file -b
的输出。它似乎对我有用:
find . -type f -printf "%b : %p : " -exec file -b {} \;
%b
格式化程序位于 512 个块中,这是我在系统文件上看到的 运行 du
。对于 1024K 块,您可能更喜欢 %k
或者 Ed 展示的 %s
。 %p
格式化程序输出完整的文件名。在 printf
格式化程序中没有给输出一个回车符 return 然后 exec 发生。我找不到提供 file -b
功能的格式化程序。
例如:
find . -type f -printf "%b : %p : " -exec file -b {} \;
8 : ./data : ASCII text
8 : ./awko : data
0 : ./nothing : empty
8 : ./data2 : ASCII text
这是我使用的 find man page 的 link。