bash将每个n个文件放入具有连续名称的不同子文件夹中

时间:2014-06-11 14:56:53

标签: bash unix ksh

我正在尝试将目录中的n个文件移动到子目录。为了清楚起见,假设我有一个名为1999的文件夹。 我在/ 1999下有364个文件,它们是每天的数据文件。我想将这些文件移动到名为周(1-52)的子文件夹中。在这种情况下,我想将第1至第7个文件移动到名为“1”的文件夹,然后将第8个第14个文件移动到名为“2”的文件夹,并将文件358th-364th移动到名为“52”的文件夹。所以我需要一个7s循环:)。我怎样才能在bash或ksh中执行此操作?

2 个答案:

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

您可以使用的工具:

* findfind /1999 -type f -maxdepth 1 ...
* datedate -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脚本,所以请尝试阅读这段代码,使用它,看看你能从中学到什么。