2014-06-08 14 views
8

Tôi mới làm quen với chương trình dựa trên vỏ sò và vỏ sò. Tôi có một loạt tệp có tên file_0001.dat, file_0002.dat......file_1000.dat. Tôi muốn thay đổi tên tập tin như số sau file_ sẽ là bội số của 4 so với tên tập tin trước đó. SO tôi muốn thay đổiMột kịch bản để thay đổi tên tệp

file_0001.dat to file_0004.dat 
file_0002.dat to file_0008.dat 

v.v.

Ai đó có thể đề xuất một tập lệnh đơn giản để làm điều đó. Tôi đã thử những điều sau nhưng không thành công.

#!/bin/bash 
a=$(echo $1 sed -e 's:file_::g' -e 's:.dat::g') 
b=$(echo "${a}*4" | bc) 
shuf file_${a}.dat > file_${b}.dat 
+0

tôi cna giúp bạn với một java hoặc php script cho việc này. Trước tiên, bạn sẽ phải quét thư mục và giữ tất cả tên tệp, sau đó ánh xạ chúng với tên mới, sau đó bắt đầu từ mức cao nhất và xuống thấp nhất. Như thể u đi từ thấp nhất - sẽ có xung đột. ví dụ u không thể đổi tên 001 thành 004 nếu có 004 từ trước. – tgkprog

+0

@tgkprog - Có vẻ như anh ấy muốn sử dụng awk/sed/bash (đó là các công cụ tốt hơn cho nhiệm vụ này). – jahroy

+0

Bạn nên chọn câu trả lời đúng, tại sao? Xem [faq] – tgkprog

Trả lời

2

Kịch bản này sẽ làm lừa đó cho bạn:

#!/bin/bash 
for i in `ls -r *.dat`; do 
    a=`echo $i | sed 's/file_//g' | sed 's/\.dat//g'` 
    almost_b=`bc -l <<< "$a*4"` 
    b=`printf "%04d" $almost_b` 
    rename "s/$a/$b/g" $i 
done 

Tệp trước khi:

file_0001.dat file_0002.dat

tập tin sau khi thực hiện đầu tiên:

file_0004.dat file_0008.dat

tập tin sau khi thực hiện thứ hai:

file_0016.dat file_0032.dat

+1

bắt đầu từ mức cao nhất và xuống thấp nhất. Như thể u đi từ thấp nhất - sẽ có xung đột. ví dụ u không thể đổi tên 001 thành 004 nếu có 004 từ trước ... nếu như lúc đầu bạn có file_0001.dat, file_0001.dat, ... file_0004.dat ...? – tgkprog

+1

Cảm ơn tgkprog - Tôi đã thay đổi mã để ngăn chặn điều đó. Cảm ơn. –

-1

này có thể giúp:

#!/bin/bash 
for i in `cat /path/to/requestedfiles |grep -o '[0-9]*'`; do 
    count=`bc -l <<< "$i*4"` 
    echo $count 
done 
1

Dưới đây là một cách bash thuần khiết để làm điều đó (không bc, đổi tên hoặc sed).

#!/bin/bash 

for i in $(ls -r *.dat); do 
    prefix="${i%%_*}_" 
    oldnum="${i//[^0-9]/}" 
    newnum="$(printf "%04d" $((10#$oldnum * 4)))" 
    mv "$i" "${prefix}${newnum}.dat" 
done 

Để kiểm tra nó, bạn có thể làm

mkdir tmp && cd $_ 
touch file_{0001..1000}.dat 
(paste code into convert.sh) 
chmod +x convert.sh 
./convert.sh 
1

Sử dụng bash/sed/find:

files=$(find -name 'file_*.dat' | sort -r) 
for file in $files; do 
    n=$(sed 's/[^_]*_0*\([^.]*\).*/\1/' <<< "$file") 
    let n*=4 
    nfile=$(printf "file_%04d.dat" "$n") 
    mv "$file" "$nfile" 
done 
1

ls -r1 | awk -F '[_.]' '{printf "%s %s_%04d.%s\n", $0, $1, 4*$2, $3}' | xargs -n2 mv

  1. ls -r1 danh sách tập tin theo thứ tự ngược lại để tránh xung đột
  2. phần thứ hai sẽ tạo tên tệp mới. Ví dụ: file_0002.dat sẽ trở thành file_0002.dat file_0008.dat
  3. xargs -n2 sẽ vượt qua hai đối mỗi khi đến mv
1

Điều này có thể làm việc cho bạn:

paste <(seq -f'mv file_%04g.dat' 1000) <(seq -f'file_%04g.dat' 4 4 4000) | 
sort -r | 
sh 
Các vấn đề liên quan