FOLDERS=$( basename "$(find "${LOG_DIR}" ! -path "${LOG_DIR}" -type d )")
/storage/archive/fakeagent/2018-07-12
/storage/archive/fakeagent/2018-06-22
使用find
命令获得此文件夹列表,并希望获得最后的文件夹名称(日期)。当我使用basename
时,我只返回一个文件夹名称,最后一个是2018-08-16
。
我应该如何获取所有文件夹名称?
2018-07-12
2018-07-14
...
2018-08-16
答案 0 :(得分:4)
您需要在-a
命令中使用选项basename
来允许多个参数:
basename -a $(find "${LOG_DIR}" ! -path "${LOG_DIR}" -type d )
basename --help
显示:
-a,--multiple支持多个参数,并将每个参数都视为一个名称
如果您的某些文件夹中有空格(或控制字符),则最好在-exec
命令中使用选项find
:
find "$LOG_DIR" -type d -exec basename "{}" \;
答案 1 :(得分:4)
您可以使用awk打印每行最后一个斜杠之后的内容:
find "${LOG_DIR}" ! -path "${LOG_DIR}" -type d | awk -F'/' '{print $NF}'
或者您可以告诉find
仅直接打印基本名称:
find "${LOG_DIR}" ! -path "${LOG_DIR}" -type d -printf '%f\n'
请注意,不鼓励使用大写变量名,因为它们更可能与环境变量和shell变量冲突,请参阅POSIX规范here,第四段。
答案 2 :(得分:0)
我认为您不应使用这样的命令。您正在将来自不同位置的文件夹混合到一个列表中,这毫无意义。换句话说,如果它将具有任何价值,请在结果中保留完整路径。另一件事,您可能希望将值放在数组中,所以我将提供上述答案的替代方案:
array=()
while IFS= read -r -d $'\0'; do
array+=("$(echo $REPLY | sed 's:.*/::')")
done < <(find . -type d -print0)
echo ${array[@]}