2017-10-13 82 views
1

我是Linux的一名完全新手(我正在使用Linux Mint),我需要您的幫助來理解基本的bash命令。Bash:在每個名字的末尾查找帶有尾部空格的目錄

我將我的文件存儲在一個外部硬盤驅動器(NTFS格式)上,我在不同的操作系統中使用它們。我的文件被組織在許多目錄(文件夾)中,每個主目錄中有更多的文件夾,並且在這些文件夾中有其他文件夾等等。我需要一個bash命令來查找所有目錄,每個名稱末尾都有尾隨空格。如果可能,我還想使用bash命令刪除空白區域。我試圖尋找其他答案,但我只能找到命令並且沒有明確的解釋他們所做的事情,所以我不確定這是否是我正在尋找的,我不想冒無意中冒險改變某些事情。任何幫助解釋使用哪些命令將不勝感激!

回答

3

以下被寫入到是易於如下(作爲二次目標),並且正確的角的情況下(作爲主要目標):

# because "find"'s usage is dense, we're defining that command in an array, so each 
# ...element of that array can have its usage described. 
find_cmd=(
    find     # run the tool 'find' 
    .     # searching from the current directory 
    -depth    # depth-first traversal so we don't invalidate our own renames 
    -type d    # including only directories in results 
    -name '*[[:space:]]' # and filtering *those* for ones that end in spaces 
    -print0    # ...delimiting output with NUL characters 
) 

shopt -s extglob       # turn on extended glob syntax 
while IFS= read -r -d '' source_name; do # read NUL-separated values to source_name 
    dest_name=${source_name%%+([[:space:]])} # trim trailing whitespace from name 
    mv -- "$source_name" "$dest_name"   # rename source_name to dest_name 
done < <("${find_cmd[@]}")     # w/ input from the find command defined above 

參見:

  • 一般描述while read循環的語法,以及上述具體修改的目的(IFS=read -r等)。
  • BashFAQ #100,描述如何在bash中執行字符串操作(特別是包括${var%suffix}語法,稱爲「參數擴展」,用於修改上述值中的後綴)。
  • Using Find,對使用find及其與bash的集成提供了一般性介紹。
+0

'mv - 「$ source_name」「$ dest_name」',這就是爲什麼查爾斯如何做到這一點總是一個好的經驗....你確實說過「*糾正在角落案件*」,完成。 –

+0

@Charles非常感謝您的回答。按照您提供的定義,我嘗試查找帶有尾部空格的目錄。我還創建了一個尾隨空格的目錄,以確保一切正常。我使用了以下語法:** find。 '* [[:space:]]'-depth -type d -print0 **。當我運行命令時,我得到了磁盤中所有目錄的列表,不區分它們是否有尾隨空格,並且我收到以下消息:**'[[:space:]]''無此文件或目錄**。你能幫我弄清楚什麼是錯的嗎? – Leia

+0

@Leia,在''* [[:space:]]'之前直接使用'-name'是很重要的 - 否則,它將被視爲要搜索的單個目錄的名稱,而不是用於過濾的條件。 (爲了解釋上面報告的結果,那麼:在你的評論中給出的命令是從*兩個*頂級目錄中搜索:'.'作爲第一個,'* [[:space:]]'作爲第二個;沒有單個目錄以後者名稱存在,因此錯誤和未過濾的輸出。) –