21

私のディレクトリ構造は次のとおりです

Directory1\file1.jpg
          \file2.jpg
          \file3.jpg

Directory2\anotherfile1.jpg
          \anotherfile2.jpg
          \anotherfile3.jpg

Directory3\yetanotherfile1.jpg
          \yetanotherfile2.jpg
          \yetanotherfile3.jpg

ubuntuのbashシェルでコマンドラインを使用して、各ディレクトリから最初のファイルを取得し、その名前をディレクトリ名に変更し、1レベル上に移動して、ディレクトリの横に配置しようとしています。

上記の例では:

  • file1.jpgに名前が変更さDirectory1.jpgれ、フォルダーの横に配置されますDirectory1

  • anotherfile1.jpg名前が変更されDirectory2.jpg、フォルダ Directory2 の横に配置されます

  • yetanotherfile1.jpgに名前が変更さDirectory3.jpgれ、フォルダーの横に配置されますDirectory3

私は使用してみました:

find . -name "*.jpg"

ただし、ファイルを順番にリストしません(最初のファイルが必要です)。

この行:

find . -name "*.jpg" -type f -exec ls "{}" +;

ファイルは正しい順序でリストされていますが、各ディレクトリの最初のファイルだけを選択して 1 レベル上に移動するにはどうすればよいですか?

どんな助けでも大歓迎です!

編集: 最初のファイルを参照するとき、各 jpg には 0 からそのフォルダー内のファイル数までの番号が付けられます。たとえば、file1、file2 ...... file34、file35 などです。ファイルの形式はランダムなので、番号付けは 0 または 1a または 1b などから始まる可能性があります...

4

4 に答える 4

35

各ディレクトリ内に移動して実行できます:

$ mv `ls | head -n 1` ..
于 2014-03-27T13:43:57.940 に答える
30

firstがシェルグロブが最初に見つけたものを意味する場合 (レキシカルですが、おそらく の影響を受けますLC_COLLATE)、これは機能するはずです:

for dir in */; do
    for file in "$dir"*.jpg; do
        echo mv "$file" "${file%/*}.jpg" # If it does what you want, remove the echo
        break 1
    done
done

コンセプトの証明:

$ mkdir dir{1,2,3} && touch dir{1,2,3}/file{1,2,3}.jpg
$ for dir in */; do for file in "$dir"*.jpg; do echo mv "$file" "${file%/*}.jpg"; break 1; done; done
mv dir1/file1.jpg dir1.jpg
mv dir2/file1.jpg dir2.jpg
mv dir3/file1.jpg dir3.jpg
于 2013-01-24T20:23:38.313 に答える
2

すべての第 1 レベルのディレクトリを探し、このディレクトリ内の最初のファイルを特定し、それを 1 レベル上に移動します

find . -type d \! -name . -prune | while read d; do
    f=$(ls $d | head -1)
    mv $d/$f .
done
于 2013-01-24T20:36:36.553 に答える