我目前正在尝试编写一个脚本,该脚本可以按日期将文件列表组织到子目录中。日期包含在每个文件的第一行,格式为YYYY-MM-DD
.我已经使用 head 命令从每个文件中提取了第一行,并将其替换为 ,-
使其/
变为YYYY/MM/DD
.这样我就可以将它用作文件路径。
然后我想创建子目录YYYY>MM>DD
,例如,包含日期的文件2015/10/19
存储在文件路径./2015
-> ./2015/10
->中./2015/10/19
。这些子目录应该创建在~/fileList/
.
这是我到目前为止的代码。
for file in ~/fileList/*
do
head -1 $file | tr "-" "/")
done
这是一个示例文件
2001-02-03
Thursday
Paris
44952
我正在努力寻找创建子目录并将每个文件存储在正确目录中的方法。任何代码建议都将不胜感激。
我正在使用 bash shell。
答案1
应执行以下操作:
for file in ~/fileList/*
do
newpath=$(head -1 "$file" | tr '-' '/')
mkdir -p "$newpath"
echo "would now execute 'mv $file $newpath'"
done
这会将转换后的日期存储在变量中$newpath
,并创建该目录以及任何缺失的父目录(如果该目录尚不存在)。该子目录将在您运行脚本的目录中创建。
在当前的形式中,它将打印将要执行的命令。当您满意后,更改为
mv "$file" "$newpath"
更新:由于您声明目标目录将位于文件最初所在的源目录下方,因此有必要进行检查,以确保您多次运行脚本时,它不会偶然发现这些新生成的条目。
- 如果您可以通过文件扩展名(例如 )来识别文件
.txt
,则可以使循环更加具体:for file in ~/fileList/*.txt do newpath=~/fileList/$(head -1 "$file" | tr '-' '/') ... done
- 否则,一种方法是仅接受常规文件作为操作数:
for file in ~/fileList/* do if [[ ! -f $file ]]; then continue; fi newpath=~/fileList/$(head -1 "$file" | tr '-' '/') mkdir -p "$newpath" mv "$file" "$newpath" done