Chciałbym mieć bardziej eleganckie rozwiązanie do masowej zmiany nazw plików, jak pokazano poniżej. Pliki miały format DEV_XYZ_TIMESTAMP.dat i potrzebowaliśmy ich jako T-XYZ-TIMESTAMP.dat. Ostatecznie skopiowałem je wszystkie (po tej samej stronie) do folderu renamed:

ls -l *dat|awk '{system("cp " $10 " renamed/T-" substr($10, index($10, "_")+1))}'

Więc najpierw wyszczególniłem wszystkie pliki danych, potem wybrałem dziesiątą kolumnę (nazwa pliku) i wykonałem polecenie używając funkcji system awk. Polecenie zasadniczo kopiowało oryginalną nazwę pliku do folderu o przemianowanej nazwie z nową nazwą pliku. Nowa nazwa pliku została utworzona przez usunięcie (funkcja awk podciąg ) przedrostka przed (w tym) _ i dodanie przedrostka „T-”.

Efektywnie:

cp DEV_file.dat renamed/T-file.dat

Czy jest sposób na użycie cp lub mv razem z pewnymi regułami wyrażeń regularnych, aby osiągnąć to samo w nieco bardziej elegancki sposób?

Dzięki

2
hummingBird 3 kwiecień 2020, 14:05

3 odpowiedzi

Najlepsza odpowiedź

Tak to zrobił:

cpdir=renamed
for file in *dat; do
    newfile=$(echo "$file" | sed -e "s/[^_]*/T/" -e "y/_/-/")
    cp "$file" "$cpdir/$newfile"
done

Skrypty sed przekształcają wszystkie wiodące znaki bez podkreślenia w jednym T, a następnie zastępują każde _ przez -. Jeśli cpdir nie jest pewien, czy istnieje przed wykonaniem, możesz po prostu dodać mkdir "$cpdir" po pierwszym wierszu.

1
Quasímodo 3 kwiecień 2020, 11:20

Możesz użyć tego skryptu:

for file in *.dat; do
   f="${file//_/-}"
   mv "$file" renamed/T-"${f#*-}"
done

Należy unikać analizowania danych wyjściowych ls Komenda.

4
anubhava 3 kwiecień 2020, 11:14

Jeśli masz narzędzie rename

rename -E "s/[^_]*/T/" -e "s/_/-/g" *dat

Próbny

$ls -1
ABC_DEF_TIMESTAMP.dat
DEV_XYZ_TIMESTAMP.dat
$rename -E  "s/[^_]*/T/" -e "s/_/-/g" * 
$ls -1
T-DEF-TIMESTAMP.dat
T-XYZ-TIMESTAMP.dat
$
2
Digvijay S 3 kwiecień 2020, 11:44