Как создать папки с помощью имен файлов и затем переместить файлы в папки?

У меня есть сотни текстовых файлов в папке, названной с помощью этого вида соглашения о присвоении имен:

Bandname1 - song1.txt
Bandname1 - song2.txt
Bandname2 - song1.txt
Bandname2 - song2.txt
Bandname2 - song3.txt
Bandname3 - song1.txt
..etc.

Я хотел бы создать папки для различных полос и переместиться согласно текстовым файлам в эти папки. Как я мог достигнуть этого удара использования, жемчуга или сценария Python?

5
задан jrara 31 January 2010 в 16:36
поделиться

7 ответов

Ответ Gregseth будет работать, просто замените обрезку с Xargs . Вы также можете устранить , если , если , просто используя MKDIR -P , например:

for f in *.txt; do
    band=$(echo "$f" | cut -d'-' -f1 | xargs)
    mkdir -p "$band"
    mv "$f" "$band"
done

Строго говоря: Trim или xargs Не следует даже быть необходимым, но xargs , по крайней мере, удалит любое дополнительное форматирование, поэтому он не повредит.

1
ответ дан 14 December 2019 в 08:50
поделиться

Это Не нужно использовать отделку или xargs:

for f in *.txt; do
    band=${f% - *}
    mkdir -p "$band"
    mv "$f" "$band"
done
4
ответ дан 14 December 2019 в 08:50
поделиться

Эта программа Python предполагает, что исходные файлы находятся в данных , и что новая структура каталога должна быть в цели (и что она уже существует).

Основная точка состоит в том, что OS.Path.walk пройдет в структуру каталогов и вызов MyVisitor для каждого файла.

import os
import os.path

sourceDir = "data"
targetDir = "target"

def myVisitor(arg, dirname, names):
    for file in names:
        bandDir = file.split("-")[0]
        newDir = os.path.join(targetDir, bandDir)
        if (not os.path.exists(newDir)):
            os.mkdir(newDir)

        newName = os.path.join(newDir, file)
        oldName = os.path.join(dirname, file)

        os.rename(oldName, newName)

os.path.walk(sourceDir, myVisitor, None)
0
ответ дан 14 December 2019 в 08:50
поделиться
ls |perl -lne'$f=$_; s/(.+?) - [^-]*\.txt/$1/; mkdir unless -d; rename $f, "$_/$f"'
-1
ответ дан 14 December 2019 в 08:50
поделиться

Как насчет этого:

for f in *.txt
do
  band=$(echo "$f" | cut -d'-' -f1 | trim)
  if [ -d "$band" ]
  then
    mkdir "$band"
  fi
  mv "$f" "$band"
done
0
ответ дан 14 December 2019 в 08:50
поделиться

с Perl

use File::Copy move;
while (my $file= <*.txt> ){
    my ($band,$others) = split /\s+-\s+/ ,$file ;
    mkdir $band;
    move($file, $band);
}
2
ответ дан 14 December 2019 в 08:50
поделиться

Вы просили конкретный скрипт, но если это для организации музыки, вы можете проверить EasyTag . Он имеет чрезвычайно специфические и мощные правила, которые вы можете настроить для организации вашей музыки, однако вы хотите:

alt text
(Источник: SourceForge.net )

Это правило говорит: «Предположим, что мои имена файлов находятся в Структура «Художник] - [Название альбома] / [Номер трека] - [Название]». Затем вы можете пометить их как таковые, или переместите файлы вокруг на любой новый шаблон, или сделать в значительной степени что-нибудь еще.

1
ответ дан 14 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: