ファイルを最初の名前で移動するためのスクリプト


2

私は1つのディレクトリにたくさんのファイル(1000以上)を持っています、そして私はそれらの最初の手紙に従って、サブディレクトリにそれらを整理したいと思います。 だから私はAで始まる200のファイルを持っている、そして私はそれらをサブディレクトリ "A"に移動したいと思う、そしてすべての "B"ファイルなど。

実行する方法 ?

回答:


5

ターミナルで: cd 問題のディレクトリに

for x in `ls -1 | sed -e 's/^\(.\).*/\1/' | sort -u`; do
mkdir $x && mv -i ${x}?* $x
done

これはあなたが始める前にどのファイルも単一の文字名を持っていないと仮定します。もしそうなら、あなたは上記の手順を実行する前にそれらを脇に移動するかもしれません:

mkdir singles && mv ? singles

その後、それらを適切な場所に移動します。

編集する いくつかの注意事項については、以下のコメントを参照してください。長すぎるコマンドラインで問題が発生した場合は、2行目を次のように置き換えることができます。

mkdir $x && find . -maxdepth 1 -name "${x}?*" -exec mv -i {} $x \;

これは、名前にスペース(または改行)が含まれているファイルでは失敗します。コマンド置換でも引数が多すぎることがあります。
slhck

@ slhck:いいえ、ファイル名のスペースは、ファイル名がスペースで始まっていなければ問題ありません。はい、改行は問題になりますが、どちらの場合も明らかに変わっています。あまりにも多くのファイル名が同じ文字で始まる場合、コマンド置換は問題になる可能性があります。しかし、コマンドラインの長さに対する現在の制限はかなり寛大であると思うので、これは示されたファイルの数ではあまりありません。それでも、私はその答えを修正します。
Harald Hanche-Olsen

ああ、私は今、私の悪い、あなたに+1を参照してください!
slhck

2

これがRubyのワンライナーです。

ruby -e 'require "FileUtils"; Dir["*"].each { |f| next if File.directory?(f); d = f[0]; Dir.mkdir d rescue nil; FileUtils.mv(f,d) }'

それは基本的にすべてのファイルを反復処理し、可能ならばディレクトリを作成し、その後ファイルをそれに移動します。

この行をディレクトリから実行するだけです。


0

これは、ファイル名がマルチバイト文字(Äやあなど)で始まっている場合にも機能します。

ls | iconv -f utf8-mac -t utf-8 | LC_CTYPE=UTF-8 cut -c1 | uniq | while IFS= read -r l; do
  f=("$l"*)
  mkdir -- "$l"
  mv -- "${f[@]}" "$l"
done

iconv -f utf8-mac -t utf-8 HFS +で使用されている部分的に分解された形式のテキストを事前構成された形式に変換します。見る VFSのテキストエンコーディング または この質問 LC_CTYPE=UTF-8 作る cut -c1 マルチバイト文字を単一文字と見なします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.