我需要bash脚本,这些是我的文件:
./2019-01-11_15-00-29_UTC.mp4
./2019-02-10_17-42-18_UTC.mp4
./2019-01-03_14-45-43_UTC.mp4
./2018-12-24_13-00-32_UTC.mp4
./2018-12-09_19-50-59_UTC.mp4
./2019-01-11_14-51-08_UTC.mp4
./2019-01-06_16-41-54_UTC.mp4
./2019-02-03_10-33-33_UTC.mp4
./2019-02-16_18-21-30_UTC.mp4
要创建两个文件夹2018
和2019
,然后将文件移动到自己的文件夹中。
我使用以下代码:
ls *.mp4 | awk -F"-" '{print $1}' | while read day file ; do mkdir -p "$day"; mv "$file" "$day"; done
它使文件夹移动但不移动
答案 0 :(得分:2)
您没有收到错误消息吗?当我运行它时,我得到
mv: cannot stat '': No such file or directory
每个文件一次。原因是您的循环中未设置file
。
ls *.mp4 | awk -F"-" '{print $1}'
将生成年份列表
2018
2018
2019
2019
2019
2019
2019
2019
2019
那是一列数据。
while read day file
将年份读入day
(天?),由于没有更多数据,file
留空。
mkdir -p "$day"
工作正常,但
mv "$file" "$day"
评估为
mv "" "2018"
尝试一下。
for f in *.mp4
do mkdir -p "${f%%-*}" && mv "$f" "${f%%-*}"
done
${f%%-*}
仅返回$f
,并删除了第一个破折号中的所有内容。结果:
$: find
.
./2018
./2018/2018-12-09_19-50-59_UTC.mp4
./2018/2018-12-24_13-00-32_UTC.mp4
./2019
./2019/2019-01-03_14-45-43_UTC.mp4
./2019/2019-01-06_16-41-54_UTC.mp4
./2019/2019-01-11_14-51-08_UTC.mp4
./2019/2019-01-11_15-00-29_UTC.mp4
./2019/2019-02-03_10-33-33_UTC.mp4
./2019/2019-02-10_17-42-18_UTC.mp4
./2019/2019-02-16_18-21-30_UTC.mp4
答案 1 :(得分:1)
您可以使用xargs来实现。
ls *.mp4 | xargs -I{} sh -c 'folder=`echo {} | cut -d"-" -f1`;mkdir -p $folder;mv {} $folder/'
在这里,整个文件名将发送到xargs
,对于每个文件,都使用cut
命令获得文件夹名。然后将文件移到创建的文件夹中。
有关xargs的更多信息:http://man7.org/linux/man-pages/man1/xargs.1.html
已编辑
for file in *.mp4 ; do
date=$(echo $file | cut -d'_' -f1)
year=$(echo $date | cut -d'-' -f1)
month=$(echo $date | cut -d'-' -f2)
day=$(echo $date | cut -d'-' -f3)
mkdir -p $year/$month/$day
mv $file $year/$month/$day/
done