2016-09-23 168 views
0

我有很多從仿真創建的文件。
像這樣:res_00001.root through res_09999.root。bash腳本創建文件夾和移動文件

我想要創建一系列文件夾,將1000個文件的批次按順序移動到基於我們正在移動的文件名的新創建的文件夾中。例如文件夾1將包含res_00001.root通過res_00999.root,通過res_01999.root文件夾2 res_01000.root,...

我試圖創建一個腳本,但它不工作:

#!/bin/bash 
N_files=$1 
for ((file=0; file<$N_files; ++file)) do #state what file I am looking at 
    s=file%1000 INPUT=printf data/output_%04lu.root $file` OUTPUT=printf data/folder%02lu/res_%04lu.root $s # move the files 
    mv INPUT OUTPUT 
done` 

我一直在敲打我的頭反對一段時間,我感謝您可以提供任何幫助。

+1

請告訴我們,正是你已經嘗試,而不是鏈接您的閱讀材料 – andrew

+1

SO不是一個代碼打印服務,提供錯誤/非工作代碼,因此我們可以幫助您對其進行分類。 ! – 2016-09-23 14:57:40

+0

'#/斌/慶典 N_files = $ 1 爲((文件= 0;文件<$ N_files; ++文件)) 做 #state什麼文件,我在看 S = I%1000 INPUT = 'printf的數據/ output_%04lu.root $ file' OUTPUT ='printf的數據/文件夾%02lu /將res_%04lu.root $ s' #移動文件 mV輸入輸出 done' –

回答

0

更新回答

可以運行這個腳本,如果你不能找到rename節目 - 製作備份第一!

#!/bin/bash 
shopt -s nullglob nocaseglob 
for f in *.root; do 
    n=$(tr -dc '[0-9]' <<< $f) 
    ((d=(10#$n/1000)+1)) 
    [ ! -d folder$d ] && mkdir folder$d 
    echo mv "$f" folder$d/$f 
done 

原來的答案

做一個備份,看看這可以幫助你在你的文件的一小部分的副本:

rename --dry-run 's/[^0-9]//g; my $d=int($_/1000)+1; $_="folder$d/res_$_.root"' *root 

樣本輸出

'res_00001.root' would be renamed to 'folder1/res_00001.root' 
'res_00002.root' would be renamed to 'folder1/res_00002.root' 
'res_00003.root' would be renamed to 'folder1/res_00003.root' 
'res_00004.root' would be renamed to 'folder1/res_00004.root' 
'res_00005.root' would be renamed to 'folder1/res_00005.root' 
... 
... 
'res_00997.root' would be renamed to 'folder1/res_00997.root' 
'res_00998.root' would be renamed to 'folder1/res_00998.root' 
'res_00999.root' would be renamed to 'folder1/res_00999.root' 
'res_01000.root' would be renamed to 'folder2/res_01000.root' 
'res_01001.root' would be renamed to 'folder2/res_01001.root' 
'res_01002.root' would be renamed to 'folder2/res_01002.root' 
'res_01003.root' would be renamed to 'folder2/res_01003.root' 
... 
... 

如果它看起來不錯,刪除--dry-run所以它實際上做的東西,而不是隻是說什麼東西做!

  • s/[^0-9]//g擺脫的任何非數字的文件名
  • my $d=int($_/1000)+1計算目錄名
  • $_="folder$d/res_$_.root"建立輸出文件名
+0

謝謝。我把它作爲終端上的一行代碼運行,但我沒有看到任何地方生成任何文件夾。如果我在../../data我期望看到數據/文件夾1,數據/文件夾2等。它運行時沒有評論,但沒有生成文件夾。我確實刪除了--dry-run –

+0

我還應該提到我在Centos7上運行,看起來我已經用選項-v冗長,-s符號鏈接,-h幫助,-V版本重命名(1)。我沒有-n的幹運行。我沒有sudo。 –

+0

您可以使用'mkdir文件夾{1..10}'將目錄預先設置爲yoursel。不知道哪個軟件包'重命名'進來Centos - 也許'moreutils'。它只是一個Perl腳本。 –

相關問題