2012-07-30 101 views
9

比方說,我在我的當前目錄下面的文件:Bash命令只移動一些文件?

1.jpg 
1original.jpg 
2.jpg 
2original.jpg 
3.jpg 
4.jpg 

是否有終端/慶典/ Linux命令,可以做到像

if the file [an integer]original.jpg exists, 
    then move [an integer].jpg and [an integer]original.jpg to another directory. 

執行這樣的命令的東西會造成1。 jpg,1original.jpg,2.jpg和2original.jpg在自己的目錄中。

備註 這不一定是一個命令。我可以是簡單命令的組合。也許像將原始文件複製到新目錄。然後對newdir中的文件執行一些正則表達式過濾器,以獲取舊目錄中仍需複製的文件名列表等。

+3

這就是爲什麼超級用戶學習編程:)好問題。 – 2012-07-30 19:09:57

+0

您是否擔心可能存在「5original.jpg」而不是「5.jpg」的情況? – 2012-07-30 21:35:13

回答

6

打開擴展的glob支持將允許您編寫一個類似於正則表達式的模式,它可以處理具有多位整數的文件,如'87 .jpg'和'87original.jpg'。然後可以用來從名稱o中去除「原始」找到一個允許您將兩個相關文件放在一起的文件。

shopt -s extglob 
for f in +([[:digit:]])original.jpg; do 
    mv $f ${f/original/} otherDirectory 
done 

在擴展圖案,+(x)匹配的一個或多個的東西的括號內,類似於正則表達式x+。這裏,x是任何數字。因此,我們匹配當前目錄中名稱由1或多個數字後跟「original.jpg」組成的所有文件。

${f/original/}bash的模式替換的示例。它將從f的值中刪除第一次出現字符串「original」。所以如果f是字符串「1original.jpg」,那麼${f/original/}是字符串「1.jpg」。

-1

您可以使用Regex語句在文件名中查找「匹配」你正在翻閱。然後在您找到的「匹配」上執行您的操作。

+1

謝謝,你可以根據上面給出的文件名顯示一個示例解決方案嗎?我從看到示例解決方案中學到了最好的東西 – John 2012-07-30 19:15:50

-1

integer=0; while [ $integer -le 9 ] ; do if [ -e ${integer}original.jpg ] ; then mv -vi ${integer}.jpg ${integer}original.jpg lol/ ; fi ; integer=$[ $integer + 1 ] ; done

請注意,這裏的 「笑」 是目標目錄。你可以把它改成你喜歡的任何東西。此外,您可以將9更改爲while [ $integer -le 9 ]以檢查大於9的整數。現在它從0開始並在檢查9 *之後停止。

編輯:如果你願意,你可以用回車代替我的代碼中的分號,它可能會更容易閱讀。而且,您可以用這種方式將整個塊粘貼到終端中,即使這可能不會立即顯而易見。

+3

您應該考慮以易於閱讀和維護的方式來格式化您的代碼。 – jordanm 2012-07-30 20:14:24

3

很好,不是直接的,但它是一個oneliner(編輯:沒有了):

for i in [0-9].jpg; do 
    orig=${i%.*}original.jpg 
    [ -f $orig ] && mv $i $orig another_dir/ 
done 

編輯:也許我應該指出我的解決方案:

  • for i in [0-9].jpg:執行循環體每個jpg文件都有一個數字作爲文件名。存儲整個文件名中$i
  • orig={i%.*}original.jpg:在$orig保存文件名可能爲「原始文件」
  • [ -f $orig ]:通過test(1)(在[ ... ]東西)如果$i原檢查文件是否存在。如果是,請將這兩個文件移動到another_dir。這是通過&&完成的:只有在測試成功時纔會執行後面的部分。
+1

您應該將代碼格式化爲多行,以便於閱讀。另外,你可以避免使用'$ {i ## * /}'來代替basename。 – jordanm 2012-07-30 20:15:58

+0

謝謝。避免使用basename和使用模式匹配是一個好主意,但'$ {i ## * /}'不適合我。我用'$ {i%。*}'代替。 – lewurm 2012-07-30 21:33:45

1

,下面這些工作,是很容易理解(與你的號碼的實際範圍替換out與輸出目錄,並{1..9}

for x in {1..9} 
do 
if [ -e ${x}original.jpg ] 
then 
mv $x.jpg out 
mv ${x}original.jpg out 
fi 
done 

可以很明顯的也進入它作爲一個單行。

+3

在沒有解釋的情況下下調完全有效的答案是沒有意義的... – houbysoft 2012-07-30 20:18:04

2

這應該嚴格任何數字前綴的工作,即234.jpg

for f in *original.jpg; do 
    pre=${f%original.jpg} 
    if [[ -e "$pre.jpg" && "$pre" -eq "$pre" ]] 2>/dev/null; then 
    mv "$f" "$pre.jpg" targetDir 
    fi 
done 

"$pre" -eq "$pre"給出了一個錯誤,如果不是整數

編輯:
如果存在original.jpg.jpg都失敗。
$pre然後是空字符串並且"$pre" -eq "$pre"爲true。