我编写了一个搜索文件然后输出它的脚本。该脚本一直有效,直到我尝试使用该命令为止du
。代码是:
#!/bin/bash
echo "Enter either file name or format:"
read File
echo "Input the absolute path to directory:"
read Dir
echo "Enter \"/path/to/directory/filename\" to store outputs on the filename:"
read results
#cd $Dir;
#for dir in */; do
# echo $Dir;
#done | xargs -P0 -I_ echo "sudo find _ -type f -name \*$File\* " > temp.txt
cd $Dir;
for dir in */; do
echo $dir;
done | xargs -P0 -I_ sudo find _ -type f -name \*$File\* | du >> $results
基本上,它会搜索您想要搜索输入文件的目录,并xargs
在那里利用尽可能多的核心。
我现在只需要输出文件的大小以及将输出到该results
文件的文件。我自己这样做会给我错误的输出,其中包含每个目录,并且找不到我搜索的文件。有任何想法吗?
答案1
你的代码有一些错误
cd $Dir
不应在脚本中使用,因为cd
可能会失败,但您的脚本仍在继续(并且会因文件夹名称中的空格而失败)。最好检查一下是否cd
成功,两个例子:
cd "$Dir" || exit 2
cd "$Dir" && for dir in */; do
sudo
不应该在脚本中使用。更好地以正确的权限运行脚本(只是意见)
sudo find _ -type f -name \*$File\*
find
如果需要循环,可以放在循环内部,不需要xargs
(意见)
for dir in */; do echo $dir; done
for 循环的意义不大(因为里面什么都没有),可以用ls -d */
.它只会打印子文件夹(排除以 开头的隐藏.
),甚至find */
直接打印也可以(更好cd "$Dir" && find ./*/
)
\*$File\* | du >> $results
不要将字符串传递给du
它,它不会执行您期望的操作。将文件名作为参数,您可以使用xargs
或更好地使用 find 来执行此操作-exec
(\;
以单独处理每个文件,或以+
一次传递所有文件名作为参数)
for dir in */; find "$dir" -type f -iname "*$File*" -exec du {} + >> "$results"; done
但是,您可以直接在父find
文件夹上运行它,而不是在子文件夹上运行,并且对于文件大小,我建议使用所需的输出,例如(除非您确实想要磁盘使用情况)"$dir"
"$Dir"
-mindepth 2
stat
stat -c %s$'\t'%n
find "$Dir" -mindepth 2 -type f -iname "*$File*" -exec stat -c %s$'\t'%n {} + >> "$results"
或者xargs -0
如果传递给的参数太多stat
find "$Dir" -mindepth 2 -type f -iname "*$File*" -print0 | xargs -0 -P0 stat -c %s$'\t'%n >> "$results"
为了更安全地处理文件夹名称,我建议使用 find while read 循环以 NUL 终止结果(GNU 扩展-print0
),请参阅此答案以供参考(尽管xargs -I_ find _
您已经找到了可行的解决方案)