Bash基本名称仅返回文件夹列表中的姓氏

时间:2018-08-17 11:18:21

标签: bash shell

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

3 个答案:

答案 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[@]}