Разделите файлы в зависимости от X и поместите в отдельную папку - PullRequest
2 голосов
/ 27 сентября 2011

Как создать сценарий в командной строке (или сценарий оболочки в bash), чтобы разделить файлы в зависимости от числа, скажем, X, и поместить в отдельную папку.

Пример: у меня 10 файлов, а число X равно 4 (я могу установить его внутри скрипта). Таким образом, система создаст 3 папки (1-я папка содержит 4 файла, 2-я папка содержит 4 файла и последняя папка будет содержать оставшиеся 2 файла) после запуска сценария.

Относительно разделения файлов. Это может быть либо дата, либо имя файла.

Пример. Предположим, что 10 файлов выше - это a.txt, aa.txt, b.txt, cd.txt, ef.txt, g.txt, h.txt, iii.txt, j.txt и zzz.txt , После запуска скрипта он создаст 3 папки, в которых 1-я папка содержит a.txt, aa.txt, b.txt, cd.txt, 2-я папка содержит ef.txt, g.txt, h.txt, iii .txt и последняя папка будут содержать оставшиеся файлы - j.txt и zzz.txt

Ответы [ 2 ]

4 голосов
/ 27 сентября 2011

Исходя из вашего описания, один лайк может достичь вашей цели.

проверьте приведенный ниже пример, вы можете изменить "4" в параметре xargs -n с помощью X:

kent$  l
total 0
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 01.txt
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 02.txt
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 03.txt
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 04.txt
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 05.txt
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 06.txt
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 07.txt
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 08.txt
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 09.txt
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 10.txt

kent$  ls|xargs -n4|awk ' {i++;system("mkdir dir"i);system("mv "$0" -t dir"i)}'


kent$  tree
.
|-- dir1
|   |-- 01.txt
|   |-- 02.txt
|   |-- 03.txt
|   `-- 04.txt
|-- dir2
|   |-- 05.txt
|   |-- 06.txt
|   |-- 07.txt
|   `-- 08.txt
`-- dir3
    |-- 09.txt
    `-- 10.txt
0 голосов
/ 27 сентября 2011
#!/usr/bin/env bash

dir="${1-.}"
x="${2-4}"

let n=0
let sub=0
while IFS= read -r file ; do
    if [ $(bc <<< "$n % $x") -eq 0 ] ; then
            let sub+=1
            mkdir -p "subdir$sub"
            n=0
    fi

    mv "$file" "subdir$sub"
    let n+=1
done < <(find "$dir" -maxdepth 1 -type f)

Работает, даже если в именах файлов есть пробелы и другие специальные символы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...