[英]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
嚴格來說,甚至不需要trim
或xargs
,但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.