(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
答案 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
创建目标目录-如果目录已经存在,则很安全,如果目录不存在,则很有必要。