#!/bin/bash
# Colourise the output
RED='\033[0;31m' # Red
GRE='\033[0;32m' # Green
YEL='\033[1;33m' # Yellow
NCL='\033[0m' # No Color
file_specification() {
FILE_NAME="$(basename "${entry}")"
DIR="$(dirname "${entry}")"
NAME="${FILE_NAME%.*}"
EXT="${FILE_NAME##*.}"
SIZE="$(du -sh "${entry}" | cut -f1)"
printf "%*s${GRE}%s${NCL}\n" $((indent+4)) '' "${entry}"
printf "%*s\tFile name:\t${YEL}%s${NCL}\n" $((indent+4)) '' "$FILE_NAME"
printf "%*s\tDirectory:\t${YEL}%s${NCL}\n" $((indent+4)) '' "$DIR"
printf "%*s\tName only:\t${YEL}%s${NCL}\n" $((indent+4)) '' "$NAME"
printf "%*s\tExtension:\t${YEL}%s${NCL}\n" $((indent+4)) '' "$EXT"
printf "%*s\tFile size:\t${YEL}%s${NCL}\n" $((indent+4)) '' "$SIZE"
}
walk() {
local indent="${2:-0}"
printf "\n%*s${RED}%s${NCL}\n\n" "$indent" '' "$1"
# If the entry is a file do some operations
for entry in "$1"/*; do [[ -f "$entry" ]] && file_specification; done
# If the entry is a directory call walk() == create recursion
for entry in "$1"/*; do [[ -d "$entry" ]] && walk "$entry" $((indent+4)); done
}
# If the path is empty use the current, otherwise convert relative to absolute; Exec walk()
[[ -z "${1}" ]] && ABS_PATH="${PWD}" || cd "${1}" && ABS_PATH="${PWD}"
walk "${ABS_PATH}"
echo
#!/usr/bin/env bash
shopt -s globstar
for i in ./**/*
do
if [ -f "$i" ];
then
printf "Path: %s\n" "${i%/*}" # shortest suffix removal
printf "Filename: %s\n" "${i##*/}" # longest prefix removal
printf "Extension: %s\n" "${i##*.}"
printf "Filesize: %s\n" "$(du -b "$i" | awk '{print $1}')"
# some other command can go here
printf "\n\n"
fi
done
虽然
find
解决方案简单而强大,但我决定创建一个更复杂的解决方案,即基于我几天前看到的这个有趣的功能。1.创建可执行脚本文件,名为
walk
,位于/usr/local/bin
可作为 shell 命令访问的位置:nano
:Shift+Insert粘贴;Ctrl+O和Enter保存;Ctrl+X退出。2.脚本内容
walk
为:三、说明:
Zanna 在她的回答
walk()
中很好地描述了该功能的主要机制。所以我将只描述新的部分。在
walk()
函数中,我添加了这个循环:这意味着对于每个
$entry
文件都将执行该函数file_specification()
。该函数
file_specification()
有两个部分。第一部分获取与文件名、路径、大小等相关的数据。第二部分以格式良好的形式输出数据。使用命令格式化数据printf
。如果你想调整脚本,你应该阅读这个命令——例如这篇文章。该功能是您可以放置应为每个文件执行的特定命令
file_specification()
的好地方。使用这种格式:或者您可以将命令的输出保存为变量,然后保存
printf
此变量等:或者直接
printf
输出命令:乞讨的部分,称为,初始化命令中用于着色输出
Colourise the output
的几个变量。printf
您可以在此处找到更多相关信息。在脚本的底部添加了处理绝对和相对路径的附加条件。
4.使用示例:
walk
为当前目录运行:walk
为任何子目录运行:要
walk
为任何其他目录运行:要根据
walk
输出创建文本文件:要创建没有颜色代码的输出文件(source):
5、使用演示:
我对为什么还没有人发布它感到有些困惑,但
bash
如果您启用globstar
选项并使用**
glob,它确实具有递归功能。因此,您可以编写(几乎)纯bash
脚本来使用该递归 globstar,如下所示:请注意,这里我们使用参数扩展来获取我们想要的文件名部分,并且我们不依赖外部命令,除了
du
使用awk
.当它遍历你的目录树时,你的输出应该是这样的:
脚本使用的标准规则适用:确保它可以
chmod +x ./myscript.sh
通过当前目录执行并运行它,./myscript.sh
或者将其放入~/bin
并运行source ~/.profile
。你可以
find
用来做这项工作如果您只想列出所有大小的文件,这将对您有所帮助。
-exec
将允许您为用于逐个解析文件的每个文件执行自定义命令或脚本, 如果您想连接它们(表示文件名)\;
,可以使用。+;
只用
find
。或者,您可以改用以下内容:
如果您知道树有多深,最简单的方法是使用通配符
*
。把你想做的所有事情写成一个 shell 脚本或一个函数
然后运行
for i in *; do thing "$i"; done
,for i in */*; do thing "$i"; done
, ... 等在您的函数/脚本中,您可以使用一些简单的测试来挑选出您想要使用的文件,并对它们进行任何您需要的操作。
find
可以这样做:查看
man find
其他文件属性。如果你真的需要扩展,你可以添加这个: