grep 之後移動目錄

grep 之後移動目錄

我已發出下一個命令,以便將某些目錄移至“build_tools”資料夾,但結果不是我預期的。

ls -l | grep 2014-03 | awk '{if ($8!=build_tools) print $8}' | xargs mkdir build_tools/{} && mv {}/ build_tools/{}/

它將資料夾「build_tools」與其餘目錄一起移動到 awk (zlib) 產生的資料夾之一,然後卡住了以下訊息:

mkdir: no se puede crear el directorio «zlib»: El archivo ya existe

有人可以闡明我的錯誤是什麼嗎?

編輯1:

ls -l 的輸出給了我:

drwxr-xr-x  3 poissonbreaker poissonbreaker     4096 2011-05-02 09:58 antlr3.2
-rw-r--r--  1 poissonbreaker poissonbreaker   318588 2011-05-17 16:21 AppFramework-1.03.jar
-rw-r--r--  1 poissonbreaker poissonbreaker        0 2014-03-04 09:53 awk
drwxr-xr-x  4 poissonbreaker poissonbreaker     4096 2013-01-11 23:13 clutter-sharp
-rw-r--r--  1 poissonbreaker poissonbreaker      429 2014-01-14 09:49 Dependencias

我只想獲取日期字段 ($6) 與 2014-03 匹配的文件,這就是為什麼我對其進行簡單的 grep 操作(目錄中沒有文件具有此模式的文件名):

ls -l  | grep 2014-03 

其產量:

-rw-r--r--  1 poissonbreaker poissonbreaker        0 2014-03-04 09:53 awk
-rw-r--r--  1 poissonbreaker poissonbreaker      429 2014-01-14 09:49 Dependencias

然後我透過 awk 取得每個檔案的檔案名稱段($8),最終移動到 build_tools 資料夾(此時我知道我的錯誤是什麼 - build_tools 資料夾也已在該日期建立:S)。不過,我會把這個問題留在這裡,以防某些部分對任何人都有用。

編輯2:我已將 awk 表達式更改為:

awk '{if ($8!=build_tools) print $8}'

讓它有意義。

答案1

我假設你有 GNU find。如果您想移動在特定時間範圍內(例如 2014 年 3 月)修改的檔案或目錄,請執行下列操作:

find . -maxdepth 1 \
-newermt 2014-02-28 -not -newermt 2014-04-01 \
-not -name 'build_tools' \
-exec mv {} build_tools \+

解釋:

  • 在此目錄中查找,無子目錄
  • 2月28日至4月1日之間的文件,其中mt指修改時間。您也可以用來ct搜尋創建時間。
  • 那些沒有被命名的build_tools
  • 將它們全部移至build_tools.這\+意味著所有找到的檔案/目錄名稱都會被替換{},而不是一次一個。如果您一次想要一個,則需要\;改為。

有幾件事:

  • 不解析輸出ls。格式取決於作業系統,awk如果檔案/目錄名稱包含空格,則選擇列會失敗。

  • 您過去常常&串聯命令,但&只是將進程置於後台。如果有的話,你應該使用&&,但總而言之,實現你想要的東西會相當複雜。

答案2

我的解決方案的正確版本需要 xargs 來處理多個命令,這可以透過使用以下命令包裝命令來實現:

sh -c (or bash -c) 'Command1; Command2; .. Comandn'

所以正確的解決方案是:

ls -l awk ' $8!=build_tools && $6 ~ /2013-03*/ {print $8}' | xargs -I @ sh -c 'mkdir build_tools/@; mv @ build_tools/@'

請注意,這會為每個要移動的檔案建立一個新資料夾。

最重要的是,雖然其他人已經透過更好和專業的工具讓我們的生活變得更輕鬆,但我們仍然可以從舊式管道查詢中學到很多東西。至少就我而言:)

相關內容