如何从多个文件夹和特定子文件夹中检索文件的路径?

时间:2019-07-11 20:19:10

标签: bash loops unix

(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

1 个答案:

答案 0 :(得分:1)

您已经有了所需的循环。问题在于,全局范围没有扩大。

#!/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或环境变量冲突。

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

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

使用mkdir -p创建目标目录-如果目录已经存在,则很安全,如果目录不存在,则很有必要。