将文件移动到 Bash 中的正确文件夹
Move files to the correct folder in Bash
我有几个格式为 ReportsBackup-20140309-04-00
的文件,我想将具有相同格式的文件发送到 201403
文件的示例中。
我已经可以根据文件名创建文件了;我只想将基于名称的文件移动到正确的文件夹中。
我用它来创建目录
old="directory where are the files" &&
year_month=`ls ${old} | cut -c 15-20`&&
for i in ${year_month}; do
if [ ! -d ${old}/$i ]
then
mkdir ${old}/$i
fi
done
你可以使用查找
find /path/to/files -name "*201403*" -exec mv {} /path/to/destination/ \;
这是我的做法。有点冗长,但希望能清楚程序在做什么:
#!/bin/bash
SRCDIR=~/tmp
DSTDIR=~/backups
for bkfile in $SRCDIR/ReportsBackup*; do
# Get just the filename, and read the year/month variable
filename=$(basename $bkfile)
yearmonth=${filename:14:6}
# Create the folder for storing this year/month combination. The '-p' flag
# means that:
# 1) We create $DSTDIR if it doesn't already exist (this flag actually
# creates all intermediate directories).
# 2) If the folder already exists, continue silently.
mkdir -p $DSTDIR/$yearmonth
# Then we move the report backup to the directory. The '.' at the end of the
# mv command means that we keep the original filename
mv $bkfile $DSTDIR/$yearmonth/.
done
我对您的原始脚本做了一些修改:
- 我不是要解析
ls
的输出。这是generally not a good idea。解析 ls 将很难获取将它们复制到新目录所需的单个文件。
- 我已经简化了你的
if ... mkdir
行:-p
标志对于“如果不存在则创建此文件夹,否则继续”很有用。
- 我稍微更改了从文件名中获取 year/month 字符串的切片命令。
我有几个格式为 ReportsBackup-20140309-04-00
的文件,我想将具有相同格式的文件发送到 201403
文件的示例中。
我已经可以根据文件名创建文件了;我只想将基于名称的文件移动到正确的文件夹中。
我用它来创建目录
old="directory where are the files" &&
year_month=`ls ${old} | cut -c 15-20`&&
for i in ${year_month}; do
if [ ! -d ${old}/$i ]
then
mkdir ${old}/$i
fi
done
你可以使用查找
find /path/to/files -name "*201403*" -exec mv {} /path/to/destination/ \;
这是我的做法。有点冗长,但希望能清楚程序在做什么:
#!/bin/bash
SRCDIR=~/tmp
DSTDIR=~/backups
for bkfile in $SRCDIR/ReportsBackup*; do
# Get just the filename, and read the year/month variable
filename=$(basename $bkfile)
yearmonth=${filename:14:6}
# Create the folder for storing this year/month combination. The '-p' flag
# means that:
# 1) We create $DSTDIR if it doesn't already exist (this flag actually
# creates all intermediate directories).
# 2) If the folder already exists, continue silently.
mkdir -p $DSTDIR/$yearmonth
# Then we move the report backup to the directory. The '.' at the end of the
# mv command means that we keep the original filename
mv $bkfile $DSTDIR/$yearmonth/.
done
我对您的原始脚本做了一些修改:
- 我不是要解析
ls
的输出。这是generally not a good idea。解析 ls 将很难获取将它们复制到新目录所需的单个文件。 - 我已经简化了你的
if ... mkdir
行:-p
标志对于“如果不存在则创建此文件夹,否则继续”很有用。 - 我稍微更改了从文件名中获取 year/month 字符串的切片命令。