Puncte:0

Creați subdosare și mutați fișiere

drapel id

Am un folder numit p/ și în p/ am mai multe subfoldere, așa:

$[~/p] ls
a/ b/ c/

a/ b/ și c/ au, de asemenea, mai multe subdosare fiecare. Încerc să găsesc un fișier care se potrivește cu un model specific în fiecare folder și subfolder al lui p/ și să le mută într-un director nou în folderul corespunzător a/, b/ și c/. Deci, a/ ar avea un nou subfolder numit x/ și în x/ vor fi mutate toate fișierele potrivite găsite în a/, b/ ar avea un nou subfolder numit x/ și în x/ vor fi mutate toate fișierele potrivite găsite în b/ și așa mai departe.

Am încercat:

pth=cale/spre/p

pentru dir în ${pth}/*; do 
    mkdir -- "$dir/x";
    găsi . -name '*match*' -exec mv -t ./x '{}' +;
Terminat

Cu toate acestea, nu funcționează, transformă subfolderul x/ în a/, b/ și c/, dar nu mută nimic.

Am:

mv: nu s-a putut accesa la „./x”: Nu există un astfel de fișier sau director

Ce gresesc?? Ma poti ajuta, te rog?

muru avatar
drapel us
Ai făcut `mkdir -- "$dir/x"`, dar apoi ai folosit `./x` în comanda `mv`.
bac0n avatar
drapel cn
Nu ar trebui să utilizați o țintă în punctul de pornire al *find*, poate crea o condiție de cursă sau cel puțin exclude ținta.
Puncte:0
drapel cn

Vă sugerez să faceți acest lucru în etape, creând mai întâi directoarele. Apoi, găsiți și organizați rezultatul căutării. Deoarece ținta dvs. se află în interiorul căutării, trebuie să tăiați ținta, altfel poate duce la condiții de cursă. Acum, am putea procesa un articol la un moment dat, dar deoarece consumă o mulțime de resurse, de obicei este mai bine să vă organizați căutarea înainte de a le muta ca mv ia doar o țintă limitează numărul de fișiere pe care le putem muta în același timp. În acest caz, putem organiza căutarea cu un tablou asociativ în care cheia devine țintă. Fișierul va fi atribuit ca șir. Este important să citați orice caractere speciale din numele fișierului sau, de exemplu, spațiile albe vor fi interpretate ca împărțirea cuvintelor (sau întreruperea în alt mod).

#!/bin/bash

cd încorporat p
printf %s/x\0 {a,b,c} | xargs -0 mkdir -p

declara -A a=()
în timp ce IFS=/ citește -rd '' b c; do
    a[${b@Q}/x]+=\ „${b@Q}/${c@Q}”
done < <(găsește -type d -cale './*/x' -prune -false -o -tip f -nume '*.txt' -printf %P\0)

pentru k în „${!a[@]}”; do
    eval printf '%s\0' "$k" "${a[$k]}" | xargs -0 mv --backup=t -t
Terminat
Al_Mt avatar
drapel id
Îmi pare rău, sunt nou la terminal și nu înțeleg foarte bine ce faci, am încercat să rulez ceea ce mi-ai sugerat și creează folderele a,b,c (dacă nu există) și subfolderul x în interior fiecare, dar nu mișcă nimic. De asemenea, nu știu întotdeauna numele a/, b/ și c/ și am sute de foldere în p/, așa că cum ar putea fi schimbat în acest caz?

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.