2009-12-01 14 views
16

Sto tentando di eseguire il comando seguente in Windows Server 2003 ma sed crea una pila di file che non riesco a eliminare dalla riga di comando all'interno della directory corrente.Sed crea file non cancellabili in Windows

for /R %f in (*.*) do "C:\Program Files\gnuwin32\bin\sed.exe" -i "s/bad/good/g" "%f"

Qualcuno ha qualche suggerimento? Misteriosamente, sono in grado di cancellare i file usando Windows Explorer.

Come richiesto, ecco alcuni esempi di nomi di file:

  • sed0E3WZJ
  • sed5miXwt
  • sed6fzFKh

E, informazioni sulla risoluzione dei problemi più ...

  • Essa si verifica da entrambi il prompt dei comandi & file batch
  • Se ho solo bisogno di eseguire sed su una singola directory, quindi io uso sed "s/bad/good/g" *.* e tutto è OK. Ahimè, ne ho bisogno anche per affrontare tutte le sottodirectory.
  • Ho installato solo Sed.
  • Sed sta creando i file
+0

Sarebbe utile se hai mostrato un esempio il nome del file. Ho provato il tuo comando con "c: \ cygwin \ bin \ sed.exe" e ha funzionato bene a parte un avvertimento sui backslash e le barre. –

+0

sed -i in realtà funziona abbastanza bene per me se il file non è di sola lettura per cominciare. Nessun residuo temporaneo di file non cancellabili e nessun errore. Dovrei menzionare che lo sto usando in combinazione con find invece che in un ciclo for. – mjohnsonengr

risposta

17

Ho replicato la configurazione e ho le seguenti osservazioni.

  1. Non penso che ci sia un problema nel ciclo. Il semplice comando "C: \ Programmi \ gnuwin32 \ bin \ sed.exe" -i "s/bad/good/g" . - crea lo stesso insieme di file temporanei.
  2. I file sono infatti creati da sed. sed crea questi file temporanei quando l'opzione "in place" (-i) è attiva. Nel corso normale, sed effettivamente cancella i file (questo è ciò che accade in cygwin) usando una chiamata alla libreria 'unlink'. In caso di gnuwin32, sembra che lo 'scollegamento' fallisca. Non sono stato in grado di capire perché. Ho immaginato che forse la chiamata di scollegamento dipende dalla libreria "coreutils" di gnuwin32 e ho provato a scaricare e installare la libreria coreutils - niente da fare.
  3. Se si rimuove la limitazione "di sola lettura" nella cartella principale prima dell'esecuzione del comando sed, è possibile eliminare i file temporanei dal prompt dei comandi di Windows. Quindi questo dovrebbe darti un po 'di tregua temporanea.

Penso che ora abbiamo abbastanza informazioni per sollevare un bug report. Se sei d'accordo, penso che potrebbe essere una buona idea portarlo all'attenzione dei bravi ragazzi responsabili di gnuwin32 e chiedere loro aiuto.

Nel frattempo, la seguente versione pulisce il suo file temporaneo:

+4

È un bug noto (http://sourceforge.net/projects/gnuwin32/forums/forum/74807/topic/845128). Ho presentato una segnalazione di errore ma non sono fiducioso (https://sourceforge.net/tracker/?func=detail&aid=2931036&group_id=23617&atid=379173). –

+0

6 anni e conteggio ... –

0

si può semplicemente eseguire sed senza ciclo for

c:\test> sed -i.bak "s/bad/good/g" file*.* 
+0

Ho appena provato che (meno il "file") in una cartella denominata "Test" con una sottodirectory denominata "Nuova cartella" e ottengo il seguente errore: C: \ Documents and Settings \ zchoy \ Desktop \ Test> "C: \ Programmi \ gnuwin32 \ bin \ sed.exe "-i.bak" s/cattivo/buono/g "*. * sed.exe: impossibile leggere Nuova cartella: Autorizzazione negata Ho anche ottenuto un file spazzatura : sed3aQhvO –

1

Cygwin i tubi di ACL sui file a volte, probabilmente dovrete usare cacls o chmod per risolvere il problema prima che tu possa cancellare il file.

+0

Sfortunatamente, non ho installato Cygwin. –

+1

@Zian cacls è un'app di Windows incorporata, così come xcacls (il nuovo 'cacls'). Inoltre, avrei dovuto menzionare che GnuWin32 probabilmente ha anche questo problema. –

1

Qui è dove entra in gioco un po 'di risoluzione dei problemi. Ciò si verifica quando si esegue il comando dalla riga di comando e un file batch? Cosa succede se si esegue sed su un singolo file sulla riga di comando - crea questi file per ogni file o solo determinati file/tipi di file? Succede solo per quella sostituzione, o per tutte le sostituzioni in generale, o solo sempre quando si esegue sed.exe su un file? Sta solo creando questi file, o tutti gli exe di Gnuwin32 (ad esempio awk, cat, ecc.)? La stessa cosa accade su un sed.exe da una nuova installazione di Gnuwin32? Che messaggio di errore dà quando cerchi di eliminare i file? Puoi cancellare i file da explorer mentre il prompt dei comandi è ancora aperto? Cosa succede se chiudi il prompt dei comandi e lo riapri, quindi prova a eliminare i file?

0

Questa è una pugnalata al buio, ma non mi sorprenderebbe minimamente se l'implementazione di gnuwin32 di sed è duff (cioè, in qualche modo difettosa). Puoi provare a replicare il problema usando il supporto POSIX AT&T U/Win per Windows? È facile da installare e include la shell Korn, sed e find, quindi è possibile utilizzare find anziché lo FOR /R. (Mi chiedo se parte del problema sia che MS FOR e gnuwin32 sed non giocano bene insieme.)

3

Poiché si tratta di un bug noto nella sed con l'opzione -i è possibile eseguire attrib -R <filename> per rimuovere solo la lettura attributo dal file dopo aver completato sed.

In alternativa, non utilizzare l'opzione -i e reindirizzare l'output in un nuovo file, quindi eliminare e rinominare l'input e l'output.

+0

o eseguire attrib -R prima di eseguire "sed -i" – mjohnsonengr

0

Mi rendo conto che questa è una vecchia discussione ma è ancora un problema. La mia correzione è di aggiungere "DEL sed *" alla fine di un file batch dopo sed. Veloce e sporco.

+0

Ho pensato che, sfortunatamente, questo cerotto non funzionerà per me per due motivi: 1. Ho i file nel mio progetto che ha un nome che inizia con sed. 2. Qualsiasi sviluppatore che lavora al mio progetto può aggiungere ulteriori file che hanno un nome che inizia con sed. –

0

Sto usando questo comando per ripulire i file temporanei creati da gnuwin32's sed:

FOR /f "tokens=*" %%a in ('dir /b ^| findstr /i "^sed[0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z]$"') DO del %%a