小编Wag*_*ags的帖子

从文件名创建子目录并按日期组织文件

我一直在使用以下脚本将我的照片组织到“日期”目录中:

for x in *.JPG; do
  d=$(date -r "$x" +%Y-%m-%d)
  mkdir -p "$d"
  mv -- "$x" "$d/"
done
Run Code Online (Sandbox Code Playgroud)

这个脚本很好用。我的照片文件遵循相同的命名约定“IMG_20131125_090000.JPG”,即拍摄日期和时间。有没有办法更改上面的脚本,以便它仍然分类到日期目录中,但使用文件名中的日期而不是使用文件的修改日期?

scripting shell-script date

5
推荐指数
1
解决办法
1830
查看次数

BusyBox ash 中的数字比较

我有以下脚本从基于我的系统上的EXIF命令中提取数据busybox ash。我从文件末尾解析日期标签,并case用作最终检查以确保格式正确。我的问题是最后的if语句似乎总是返回 true; d="$e - Jebby (exif"总是运行。如果 Iecho $en并且echo $dn它显示$en大于$dn但该if语句仍然运行d="$e - Jebby (exif".

x=<valid filename>
e=$(exif -d -m -t 0x9003 -- "$x" 2>/dev/null)
let l=${#e}-18
e=$(expr substr "$e" $l 19)
e="${e%[ ][0-2][0-9][:][0-6][0-9][:][0-6][0-9]*}" 
e="${e##*[!1-2][!09][!0-9][!0-9][!:][!0-1][!0-9][!:][!0-3][!0-9]}"
e=$(expr substr "$e" 1 4)$(expr substr "$e" 6 2)$(expr substr "$e" 9 2)
case "$e" in 
   [1-2][09][0-9][0-9][0-1][0-9][0-3][0-9])
     let en=$e+3
     ds="${d% - Jebby (}" …
Run Code Online (Sandbox Code Playgroud)

shell-script busybox ash

5
推荐指数
1
解决办法
3978
查看次数

为什么我对 ls 输出的循环不起作用?

我正在尝试将目录名称输入 for 循环。我的代码如下:

td='/Test/TopDir/'
cd "$td" 
for x in $(ls -d */ | cut -f1 -d'/'); do
  echo x=$x
done
Run Code Online (Sandbox Code Playgroud)

运行 ls 命令时,我运行它的顶级目录如下所示:

ls -l
drwxrwxrwx    4 Jason    users         4096 May  6 06:36 2014-02-02 - Jebby (
drwxrwxrwx    3 Jason    users         4096 May  6 06:09 2014-02-04 - Jebby (
drwxrwxrwx    2 root     root          4096 May  6 06:09 @eaDir
-rw-r--r--    1 Jason    users      3956225 Jan 26 10:17 DSC01062.JPG
-rw-r--r--    1 Jason    users      3927603 Jan 26 10:18 DSC01063.JPG
Run Code Online (Sandbox Code Playgroud)

我的for循环结果如下:

x=2014-02-02
x=-
x=Jebby …
Run Code Online (Sandbox Code Playgroud)

ls shell shell-script

5
推荐指数
1
解决办法
1991
查看次数

使用 shell 脚本对照片进行排序

我的大部分照片文件都有以下命名约定/格式 IMG_20131204_120000.JPG,显示照片拍摄的日期和时间(iPhone/Apple 命名约定)。但是,并非我的所有照片都遵循此命名约定。在这个论坛的帮助下,我开发了以下脚本来将我的照片分类到日期目录中:

cd '/photos/' 
for x in *.JPG *.jpg *.TIF *.tif *.PNG *.png *.BMP *.bmp *.GIF *.gif *.IMG *.img *.JPEG *.jpeg *.TIFF *.tiff; do
  d=$(date -r "$x" +%Y%m%d)" - Family Photos"
  t=$(expr substr "$x" 1 4)
  if [ "$t" == "IMG_" ]; then
    d=$(expr substr "$x" 5 8)" - Family Photos"
  fi
  mkdir -p "$d" >/dev/null 2>&1
  mv -- "$x" "$d/" >/dev/null 2>&1
done
Run Code Online (Sandbox Code Playgroud)

附注。如果文件名的格式为 IMG_20131204_120000.JPG,我使用 IF 语句从文件名本身获取日期,因为此日期最准确地反映了照片实际拍摄的日期,但如果文件不遵循此命名约定,我取上次修改/创建文件的操作系统日期。

除了文件以“IMG_”开头但不符合命名约定 IMG_20131204_120000.JPG(例如名为 IMG_001.JPG 或 IMG_Photo1 的文件)之外,它在大多数情况下都能正常工作。有没有更好的方法来构造 IF 语句,以便它不仅检查文件是否以“IMG_”开头,而且接下来的 8 个字符是数字/日期格式?

shell-script

3
推荐指数
1
解决办法
1465
查看次数

标签 统计

shell-script ×4

ash ×1

busybox ×1

date ×1

ls ×1

scripting ×1

shell ×1