Как создавать папки, используя имена файлов, а затем перемещать файлы в папки? - PullRequest
5 голосов
/ 31 января 2010

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

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

Я хотел бы создать папки для разных полос и переместить соответствующие текстовые файлы в эти папки. Как я могу добиться этого с помощью скриптов bash, perl или python?

Ответы [ 7 ]

4 голосов
/ 31 января 2010

Нет необходимости использовать трим или xargs:

for f in *.txt; do
    band=${f% - *}
    mkdir -p "$band"
    mv "$f" "$band"
done
2 голосов
/ 01 февраля 2010

с Perl

use File::Copy move;
while (my $file= <*.txt> ){
    my ($band,$others) = split /\s+-\s+/ ,$file ;
    mkdir $band;
    move($file, $band);
}
1 голос
/ 31 января 2010

gregseth ответ будет работать, просто замените trim на xargs. Вы также можете отменить тест if, просто используя 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 голос
/ 31 января 2010

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

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

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

0 голосов
/ 31 января 2010

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

Ключевым моментом является то, что os.path.walk будет проходить через структуру каталогов data и вызывать 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 голосов
/ 31 января 2010
ls |perl -lne'$f=$_; s/(.+?) - [^-]*\.txt/$1/; mkdir unless -d; rename $f, "$_/$f"'
0 голосов
/ 31 января 2010

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

for f in *.txt
do
  band=$(echo "$f" | cut -d'-' -f1 | trim)
  if [ -d "$band" ]
  then
    mkdir "$band"
  fi
  mv "$f" "$band"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...