Bash 如何打开最后一个文件夹而不考虑名称
How to open the last folder irrespective of name on Bash
我目前正在使用一个程序创建一个带有时间戳的文件夹并将一些文件放入其中。
我想编写一个脚本来按字母顺序自动从最后一个或倒数第二个文件夹中检索文件。
如何在 bash 上执行此操作?
图片供参考。我想从 18-38 文件夹或 17-45 文件夹中检索文件。
假设您有这些目录:
% ls -l
total 0
drwxr-xr-x 2 andrew wheel 64 Mar 3 15:19 1
drwxr-xr-x 2 andrew wheel 64 Mar 3 15:19 2
drwxr-xr-x 2 andrew wheel 64 Mar 3 15:19 3
drwxr-xr-x 2 andrew wheel 64 Mar 3 15:19 4
drwxr-xr-x 2 andrew wheel 64 Mar 3 15:19 5
'last' 为 5
。
你可以做到:
% for fn in *; do [[ -d "$fn" ]] && lf="$fn"; done
% echo "$lf"
5
不过,我不能过分强调 *
可能 或 可能不会 给你你认为的 'last directory.'
如果要保证是最后一个,按stat
排序,然后取最后一个。
I want to write a script to automate retrieval of the file from last or second last folder by alphabetical order.
cd path/to/02-March-2022
last_dir=$(printf '%s\n' */ | sort | tail -n 1)
second_last_dir=$(printf '%s\n' */ | sort -r | sed '2!d; 2q')
- 您可以删除或添加排序
-r
以在第 N 个最新和第 N 个最旧之间切换。
编辑:
- Glob 始终按字母顺序排序(根据当前语言环境),因此第一个
sort
实际上是多余的。但如果您需要额外的 sort
标志,或者按特定字段、后缀等进行排序,sort
很有用。
sort
和路径名扩展都受当前语言环境的影响,因此请考虑设置 LC_ALL=C
以获得一致的行为。 (export LC_ALL=C
或 LC_ALL=C sort
sort
才能看到)。
尝试
folders=( path/to/02-March-2022/*/ )
last_dir=${folders[-1]%/}
second_last_dir=${folders[-2]%/}
由于默认情况下 globbing 是按字母顺序排列的,因此我会将所有文件名加载到一个数组中并选择最后一个元素:
all_files=( * )
last_file=${all_files[-1]}
有两个想法值得注意:
- 如果目录条目可能是文件或子目录,则必须以相反的顺序遍历
all_files
并选择第一个纯文件。
- 您想按字母顺序对它们进行排序,但该术语的 含义,即 sort order,取决于您的环境 - 特别是变量
LC_COLLATE
,分别是LC_ALL
。您可能需要设置
即:
export LC_ALL=C
在创建数组之前。
我目前正在使用一个程序创建一个带有时间戳的文件夹并将一些文件放入其中。
我想编写一个脚本来按字母顺序自动从最后一个或倒数第二个文件夹中检索文件。
如何在 bash 上执行此操作?
图片供参考。我想从 18-38 文件夹或 17-45 文件夹中检索文件。
假设您有这些目录:
% ls -l
total 0
drwxr-xr-x 2 andrew wheel 64 Mar 3 15:19 1
drwxr-xr-x 2 andrew wheel 64 Mar 3 15:19 2
drwxr-xr-x 2 andrew wheel 64 Mar 3 15:19 3
drwxr-xr-x 2 andrew wheel 64 Mar 3 15:19 4
drwxr-xr-x 2 andrew wheel 64 Mar 3 15:19 5
'last' 为 5
。
你可以做到:
% for fn in *; do [[ -d "$fn" ]] && lf="$fn"; done
% echo "$lf"
5
不过,我不能过分强调 *
可能 或 可能不会 给你你认为的 'last directory.'
如果要保证是最后一个,按stat
排序,然后取最后一个。
I want to write a script to automate retrieval of the file from last or second last folder by alphabetical order.
cd path/to/02-March-2022
last_dir=$(printf '%s\n' */ | sort | tail -n 1)
second_last_dir=$(printf '%s\n' */ | sort -r | sed '2!d; 2q')
- 您可以删除或添加排序
-r
以在第 N 个最新和第 N 个最旧之间切换。
编辑:
- Glob 始终按字母顺序排序(根据当前语言环境),因此第一个
sort
实际上是多余的。但如果您需要额外的sort
标志,或者按特定字段、后缀等进行排序,sort
很有用。 sort
和路径名扩展都受当前语言环境的影响,因此请考虑设置LC_ALL=C
以获得一致的行为。 (export LC_ALL=C
或LC_ALL=C sort
sort
才能看到)。
尝试
folders=( path/to/02-March-2022/*/ )
last_dir=${folders[-1]%/}
second_last_dir=${folders[-2]%/}
由于默认情况下 globbing 是按字母顺序排列的,因此我会将所有文件名加载到一个数组中并选择最后一个元素:
all_files=( * )
last_file=${all_files[-1]}
有两个想法值得注意:
- 如果目录条目可能是文件或子目录,则必须以相反的顺序遍历
all_files
并选择第一个纯文件。 - 您想按字母顺序对它们进行排序,但该术语的 含义,即 sort order,取决于您的环境 - 特别是变量
LC_COLLATE
,分别是LC_ALL
。您可能需要设置
即:
export LC_ALL=C
在创建数组之前。