2013-01-24 28 views
10

我的目錄結構如下命令行找到第一個文件的目錄

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

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

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

我試圖使用命令行Ubuntu上一個bash shell從每個目錄採取的第一個文件,並將其重命名到目錄名稱並將其向上移動一層,以使其位於目錄旁邊。

在上面的例子:

  • 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 "{}" +; 

列出了正確的順序文件,但我怎麼只選擇第一個文件中的每個目錄,將其向上一個級別?

任何幫助,將不勝感激!

編輯:當我指的第一個文件我的意思是每個jpg從0到該文件夾​​中的許多文件編號 - 例如:文件1,文件2 ......文件34,文件35等...另一件要提到的是文件的格式是隨機的,所以編號可能開始在0或1a或1b等...

+1

定義「第一」。 –

+0

擴大Ignacio的評論,重要的是要知道你的意思是「第一」。首先按字母順序?如果是這樣,並且如果數字是2位數,那麼您是否想在file10.jpg之前對file3.jpg進行排序,而不是按照字母順序排列file10.jpg先出現的位置?如果你不想按字母順序排列,你需要按照存儲在磁盤上的順序排列第一個嗎?按日期?等等。 – Bdoserror

回答

20

如果第一意味着任何shell glob找到第一(詞彙,但可能受到影響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 
+0

這正是我所需要的 - 謝謝! – user2008746

1

查找所有一級目錄,確定第一個文件在此目錄中,然後將它的上一級

find . -type d \! -name . -prune | while read d; do 
    f=$(ls $d | head -1) 
    mv $d/$f . 
done 
16

你可以去每個目錄內運行:

$ mv `ls | head -n 1` .. 
+0

簡單和Unixy,我喜歡 – Cyril

+0

@Cyril [這是一個壞主意,管'ls'就像那樣](https://unix.stackexchange.com/q/128985/44425) –

+0

嗨@LưuVĩnhPhúc,感謝您的鏈接。這篇文章很好。然而,在我的情況下,文件名都是自動生成的,並遵循特定的預定義格式。所以文章警告的邊緣案例並不適用。在一般情況下,是的,可能不是一個好主意。謝謝! – Cyril

相關問題