2017-08-26 113 views
2

我的文件將文件複製到文件夾中有與父目錄相同首頁

1996-08-30T02.11.41.940_10 

1997-03-04T17.24.17.650_17 

1997-04-01T15.43.26.390_20 

和文件夾

1996-08-30T02.11.41.940_5.1 

1997-03-04T17.24.17.650_5.0 

1997-04-01T15.43.26.390_4.5 

的文件和文件夾都在同一個目錄中。我想移動文件,其名稱相同而不同後綴 前一個文件夾: 文件1996-08-30T02.11.41.940_10應在文件夾中移動1996-08-30T02.11.41.940_5.1

我已經試過這一點,但沒有用

for file in ./*T* ; do mv -v $file ${file%_*}; done 

回答

1

你是非常接近:

$ for file in ./* ; do [ -f "$file" ] && mv -v "$file" "${file%_*}"*/; done 
'./1996-08-30T02.11.41.940_10' -> './1996-08-30T02.11.41.940_5.1/1996-08-30T02.11.41.940_10' 
'./1997-03-04T17.24.17.650_17' -> './1997-03-04T17.24.17.650_5.0/1997-03-04T17.24.17.650_17' 
'./1997-04-01T15.43.26.390_20' -> './1997-04-01T15.43.26.390_4.5/1997-04-01T15.43.26.390_20' 

注:

  1. 除非你特別想讓shell破壞東西,否則總是把shell變量放在雙引號中。

  2. 我們增加了測試[ -f "$file" ]以便我們只嘗試移動普通文件而不是目錄。

  3. 該目錄將匹配${file%_*}"*/。根據問題描述,我們假設只有一個這樣的目錄。

1

以下是@ John1024的類似方法,但依賴於bash特性。

首先,創建關聯數組,映射「共同的根」的目錄名:

declare -A dirs 
for d in */; do dirs["${d%_*}"]=$d; done 

然後,遍歷文件,並移動到該目錄與公共根

for f in *; do 
    [[ -f $f ]] || continue 
    root=${f%_*} 
    if [[ ${dirs[$root]} ]]; then 
     mv -v "$f" "${dirs[$root]}" 
    else 
     echo "error: no directory for '$f'" 
    fi 
done 
'1996-08-30T02.11.41.940_10' -> '1996-08-30T02.11.41.940_5.1/1996-08-30T02.11.41.940_10' 
'1997-03-04T17.24.17.650_17' -> '1997-03-04T17.24.17.650_5.0/1997-03-04T17.24.17.650_17' 
'1997-04-01T15.43.26.390_20' -> '1997-04-01T15.43.26.390_4.5/1997-04-01T15.43.26.390_20' 

這解決了只有一個通用根目錄的假設:文件將被移動到last這樣的目錄(按字母順序)

+0

很好的錯誤處理。 – John1024

相關問題