我正在尝试将目录中的n个文件移动到子目录。为了清楚起见,假设我有一个名为1999的文件夹。 我在/ 1999下有364个文件,它们是每天的数据文件。我想将这些文件移动到名为周(1-52)的子文件夹中。在这种情况下,我想将第1至第7个文件移动到名为“1”的文件夹,然后将第8个第14个文件移动到名为“2”的文件夹,并将文件358th-364th移动到名为“52”的文件夹。所以我需要一个7s循环:)。我怎样才能在bash或ksh中执行此操作?
答案 0 :(得分:2)
这是一个伪代码:
Get timestamp of the beginning of the year 1999 as FIRST_TS
Get timestamp of the end of the year 1999 as LAST_TS
For each file in /1999 as FILE
Get timestamp of FILE as FILE_TS
SUBFOLDER = (Integer) 52 * ((FILE_TS - FIRST_TS) / (LAST_TS - FIRST_TS)) + 1
Create folder named as /1999/SUBFOLDER if it doesn't exist
Move FILE to folder SUBFOLDER
End
您可以使用的工具:
* find
(find /1999 -type f -maxdepth 1 ...
)
* date
(date -r "$FILE" '+%s'
)
更新
#!/bin/bash
shopt -s extglob
YEAR=1999
ROOT=/$YEAR
for FILE in "$ROOT"/"$YEAR"_???.dat; do
N=${FILE##*_*(0)}; N=${N%.dat}; N=$(( (N - 1) / 7 + 1 ))
DEST=$ROOT/$N
[[ -d $DEST ]] || mkdir -p "$DEST" || {
echo "Failed to create destination directory \"$DEST\"." >&2
exit 1
}
mv -v -- "$FILE" "$DEST" || {
echo "Failed to move \"$FILE\" to \"$DEST\"." >&2
exit 1
}
done
答案 1 :(得分:1)
这对我有用:
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 52 ]; do
mkdir $((COUNTER + 1)) # Leave this out if the directories already exist.
mv `seq $((COUNTER*7 + 1)) $((COUNTER*7 + 7)) | xargs print "1999_%03d.dat "` $((COUNTER + 1))
COUNTER=$((COUNTER + 1))
done
但除非你想永远保持“全新手”,否则你应该尝试自己拿出来!如果你可以完全掌握这个片段所做的一切,那么你将很好地理解shell脚本,所以请尝试阅读这段代码,使用它,看看你能从中学到什么。