簡體   English   中英

如何使用文件名創建文件夾,然后將文件移動到文件夾中?

[英]How to create folders using file names and then move files into folders?

我在使用這種命名約定命名的文件夾中有數百個文本文件:

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

我想為不同的樂隊創建文件夾,並根據文本文件移動到這些文件夾中。 我怎么能用bash,perl或python腳本實現這個目的?

沒有必要使用trim或xargs:

for f in *.txt; do
    band=${f% - *}
    mkdir -p "$band"
    mv "$f" "$band"
done

與Perl

use File::Copy move;
while (my $file= <*.txt> ){
    my ($band,$others) = split /\s+-\s+/ ,$file ;
    mkdir $band;
    move($file, $band);
}

您要求提供特定腳本,但如果這是用於組織音樂,您可能需要查看EasyTAG 它具有非常具體和強大的規則,您可以根據需要自定義組織音樂:

替代文字
(來源: sourceforge.net

這條規則說,“假設我的文件名在結構中”[藝術家] - [專輯標題] / [曲目編號] - [標題]“。然后你可以標記它們,或者將文件移動到任何新模式,或做其他任何事情。

gregseth的答案會起作用,只需用xargs替換trim 你也可以通過使用mkdir -p消除if測試,例如:

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

嚴格來說,甚至不需要trimxargs ,但xargs至少會刪除任何額外的格式,所以它不會受到傷害。

這個怎么樣:

for f in *.txt
do
  band=$(echo "$f" | cut -d'-' -f1 | trim)
  if [ -d "$band" ]
  then
    mkdir "$band"
  fi
  mv "$f" "$band"
done

這個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)
ls |perl -lne'$f=$_; s/(.+?) - [^-]*\.txt/$1/; mkdir unless -d; rename $f, "$_/$f"'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM