我已發出下一個命令,以便將某些目錄移至“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/@'
請注意,這會為每個要移動的檔案建立一個新資料夾。
最重要的是,雖然其他人已經透過更好和專業的工具讓我們的生活變得更輕鬆,但我們仍然可以從舊式管道查詢中學到很多東西。至少就我而言:)