移动文件专用文件夹

时间:2019-04-24 14:26:54

标签: bash

我需要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

要创建两个文件夹20182019,然后将文件移动到自己的文件夹中。 我使用以下代码:

ls *.mp4 | awk -F"-" '{print $1}' | while read day file ; do mkdir -p "$day"; mv "$file" "$day"; done

它使文件夹移动但不移动

2 个答案:

答案 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