Puncte:2

Găsiți toate fișierele cu extensia dată în subdosare și adăugați subșirul corespunzător subdosarului

drapel cn

am numeroase TXT fișiere, împrăștiate în diferite foldere.

- cazul 1
   |
    - 0,25
       |
        - case1.txt
    - 0,35
       |
        _ case1.txt
    - 0,30
       |
        _ case1.txt
    - 0,45
       |
        _ case1.txt

- cazul 2
   |
    - 0,25
       |
        - case2.txt
    - 0,35
       |
        _ case2.txt
    - 0,30
       |
        _ case2.txt
    - 0,45
       |
        _ case2.txt

.
.
.

Aș dori să le copiez pe toate într-un folder, dar, din păcate, după cum puteți vedea, unele dintre ele au același nume și, prin urmare, un naiv. găsi soluția ajunge să le suprascrie. Aș dori să copiez toate TXT fișiere într-un director foo, inserând numele numelui subdosarului în care se află, înainte de .TXT extensie. De asemenea, deoarece subfolderul are un punct în nume și trebuie să copiez aceste fișiere în Windows, aș dori, de asemenea, să schimb 0.25 la 0_25. Cu alte cuvinte, dosarul

- cazul 2
   |
    - 0,25
       |
        - case2.txt

trebuie copiat în foo la fel de case2_0_25.txt. Dacă o soluție bash este prea complexă/ilizibilă, o soluție Python ar fi bine, dar nu unul zsh.

Puncte:3
drapel cn

Împărțiți copia în două transformări în care primul pas traduce puncte și bare oblice pentru a sublinia, iar următorul rearanjează subexpresiile potrivite în ordinea dorită.

shopt -s globstar; \
tar -cvf - --show-transformed-names --transform='s![.]!_!g' --transform='s!.*/\([^/]\+\)/\([ ^/]\+\)_txt$!foo/\2_\1.txt!' caz*/**/*.txt | tar -xf -

Acum, este crucial --transforma potriviri, sau acele fișiere vor trece prin neprocesate.

O soluție Bash va funcționa în același mod.

#!/bin/bash

shopt -s nullglob globstar

mkdir -p foo
while read -rd ''; do
    [[ ${REPLY//./_} =~ ([^/]+)/([^/]+)_txt$ ]] && 
        cp -va „$REPLY” „foo/${BASH_REMATCH[2]}_${BASH_REMATCH[1]}.txt”
terminat < <(printf %s\0 case*/**/*.txt)
Puncte:2
drapel cn

Puteți face acest lucru destul de ușor folosind opțiunea globstar a bash (de la man bash):

globstar

Dacă este setat, modelul ** utilizat într-un context de extindere a numelui de cale se va potrivi cu toate fișierele și cu zero sau mai multe directoare și subdirectoare. Dacă modelul este urmat de a /, numai directoarele și subdirectoarele se potrivesc.

Din moment ce putem folosi ** pentru a găsi fișierele, trebuie doar să definim noul nume ca incluzând numele directorului original și schimbare . la _:

pentru fișier în **/*.txt; do 
    newName=$(sed 's|[/.]|_|g' <<<"$fișier" | sed 's/_txt$/.txt/')
    cp -- "$file" foo/"$newName" 
Terminat

Explicaţie

  • pentru fișier în **/*.txt; do: găsiți toate fișierele (și directoarele, dacă este relevant) din directorul curent al cărui nume se termină în *.TXT.
  • newName=$(sed 's|[/.]|_|g' <<<"$fișier" | sed 's/_txt$/.txt/') : utilizare sed a converti toate / și . la _ în numele fișierului. Rețineți că $file aici include și calea, așa că va fi ceva de genul case1/0,25/case1.txt si asta devine case1_0_25_case1_txt. Trecem apoi rezultatul primului sed la un al doilea care se convertește _TXT (dacă se găsește la sfârșitul rândului) să .TXT, oferindu-ne ``case1_0_25_case1.txt. Ieșirea finală este salvată în variabilă $newName`.
  • cp -- "$file" foo/"$newName": acum copiam fisierul in director prost/ si cu noul nume. The -- nu este cu adevărat necesar aici, dar asigură că abordarea va funcționa cu orice nume de fișier, inclusiv cu cele al căror nume începe cu a -.

Am recreat structura de foldere pe care o afișați în întrebarea dvs., am rulat comanda de mai sus și am primit:


$ copac
.
âââ cazul1
â  âââ 0,25
â  â  âââ case1.txt
â  âââ 0,30
â  â  âââ case1.txt
â  âââ 0,35
â  â  âââ case1.txt
â  âââ 0,45
â  âââ case1.txt
âââ cazul2
â  âââ 0,25
â  â  âââ case2.txt
â  âââ 0,30
â  â  âââ case2.txt
â  âââ 0,35
â  â  âââ case2.txt
â  âââ 0,45
â  âââ case2.txt
âââ foo
    âââ case1_0_25_case1.txt
    âââ case1_0_30_case1.txt
    âââ case1_0_35_case1.txt
    âââ case1_0_45_case1.txt
    âââ case2_0_25_case2.txt
    âââ case2_0_30_case2.txt
    âââ case2_0_35_case2.txt
    âââ case2_0_45_case2.txt

11 directoare, 16 fișiere

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.