2016-08-24 5 views
0

Ich verstehe, dass eine Technik für den Umgang mit Leerzeichen in Dateinamen den Dateinamen mit einfachen Anführungszeichen einschließen: "'" .Ich habe ein Verzeichnis und einen Dateinamen mit Leerzeichen. Ich möchte, dass ein Shell-Skript alle Dateien zusammen mit dem angegebenen Zeit- und Verzeichnisnamen liest. Ich schrieb das folgende Skript:Shell-Skript-Problem mit Verzeichnis und Dateinamen mit Leerzeichen

#!/bin/bash 
CURRENT_DATE=`date +'%d%m%Y'` 
Temp_Path=/appinfprd/bi/infogix/IA83/InfogixClient/Scripts/IRP/ 
find /bishare/IRP_PROJECT/SFTP/ -type f | xargs ls -al > $Temp_Path/File_Posted_$CURRENT_DATE.txt 

die teilweise funktioniert. Es funktioniert nicht für das Verzeichnis und die Dateien, die ein Leerzeichen enthalten.

+0

Wenn Sie eine Zeichenfolge mit Leerzeichen erscheinen als ein einziges Token wollen, setzen Sie es nur in doppelten Anführungszeichen. Zum Beispiel, "$ Temp_Path/File_Posted_ $ CURRENT_DATE.txt" ' –

Antwort

1

Verwenden Sie find -print0 | xargs -0, um Dateinamen mit Sonderzeichen zuverlässig zu verarbeiten, einschließlich Leerzeichen und Zeilenumbrüche.

find /bishare/IRP_PROJECT/SFTP/ -type f -print0 | 
    xargs -0 ls -al > "$Temp_Path/File_Posted_$CURRENT_DATE.txt" 

Alternativ können Sie find -exec verwenden, die auf jede Datei gefunden den Befehl Ihrer Wahl läuft.

find /bishare/IRP_PROJECT/SFTP/ -type f -exec ls -al {} + \ 
    > "$Temp_Path/File_Posted_$CURRENT_DATE.txt" 

Im speziellen Fall von ls -l könnten Sie weiter diesen einen Schritt und die -ls Aktion verwenden.

find /bishare/IRP_PROJECT/SFTP/ -type f -ls > "$Temp_Path/File_Posted_$CURRENT_DATE.txt" 

Sie sollten auch in der Gewohnheit alle variablen Erweiterungen zu zitieren, wie Sie in Ihrem Beitrag erwähnt.

0

Sie können das IFS-Variable für einen Moment ändern (Internal Fields Separator):

#!/bin/bash 
# Backing up the old value of IFS 
OLDIFS="$IFS" 
# Making newline the only field separator - spaces are no longer separators 
# NOTE that " is the last character in line and the next line starts with " 
IFS=" 
" 
CURRENT_DATE=`date +'%d%m%Y'` 
Temp_Path=/appinfprd/bi/infogix/IA83/InfogixClient/Scripts/IRP/ 
find /bishare/IRP_PROJECT/SFTP/ -type f | xargs ls -al > $Temp_Path/File_Posted_$CURRENT_DATE.txt 
# Restore the original value of IFS 
IFS="$OLDIFS" 
Verwandte Themen