【问题标题】:How to retrieve the path of the file from within multiple folders and specific sub-folders?如何从多个文件夹和特定子文件夹中检索文件的路径?
【发布时间】:2019-07-11 20:19:10
【问题描述】:

(Unix)

我在需要移动到存储目录的目录和子目录中有文件。文件夹结构为:

Main_folder: Folder1 > Inbox > File1
                 > Outbox
         Folder2 > Inbox > File2
                 > Outbox
         Folder3 > Inbox > File3
                 > Outbox
         ....

我只需要从收件箱文件夹中移动文件。我必须做一个循环吗?如果是这样,我将如何在现有脚本中添加循环?

谢谢。

我目前有 BASE_DIR="Main_folder/*/Inbox" 但它没有通过其余的文件夹?

#!/bin/bash

BASE_DIR="Main_folder/*/Inbox"

TARGET_DIR="$2"



find "$BASE_DIR" -type f -name "*.txt" | while IFS= read -r file; do

year="$(date -d "$(stat -c %z "$file")" +%Y)"

month="$(date -d "$(stat -c %z "$file")" +%m)"

day="$(date -d "$(stat -c %z "$file")" +%d)"



mv --backup=t "$file" "$TARGET_DIR/$year/$month/$day"



enter code here

done

【问题讨论】:

  • cd Main_folder; mv */Inbox/* "$TARGET_DIR/$year/$month/$day" 怎么样?

标签: bash loops unix


【解决方案1】:

你已经有了你需要的循环。问题是 glob 没有得到扩展。

#!/bin/bash

base_dir="Main_folder/*/Inbox"

target_dir="$2"

find $base_dir -type f -name "*.txt" | while IFS= read -r file; do

    read -r year month day < <(date -d "$(stat -c %z "$file")" '+%Y %m %d')

    mkdir -p "$target_dir/$year/$month/$day"

    mv --backup=t "$file" "$target_dir/$year/$month/$day"

    # enter code here

done

使用小写或混合大小写的变量以避免与 shell 或环境变量的潜在名称冲突。

这是不应引用变量的情况之一。否则,glob 不会被扩展。请注意,相比之下,-name 参数中的 glob 由 find 处理,而不是由 shell 处理,并且几乎总是应该被引用。

从文件中读取一次日期,然后解析它的组件。这更快、更有效,在重要的情况下,它可以避免跨越午夜的问题,并且在其他情况下可能会有所帮助(但请注意,非原子操作可能会出现问题)。

使用mkdir -p 创建目标目录 - 如果它已经存在则这样做是安全的,如果不存在则它是必要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2015-11-03
    • 2014-12-27
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多