Linux用管道命令對文件的移動


我的問題是這樣的:我有一個文件夾,里面有大約有1000個文件,然后我想把這樣的一部分文件給隨機分成兩部分,一部分含有100張,另外一部分含有剩下的所有的文件,這個時候如果是在Linux圖形界面的話直接拖動即可,但是在Linux終端的話,還需要下一些功夫

以下內容主要為管道命令

我們知道命令ll,可以以行的形式列出當前文件夾下所有的文件以及目錄,如下圖

linux中的cut命令可以以列的形式來對於字符串進行操作,類似於python中的字符串的split函數,cut用-d參數來指定以什么字符來進行分割,用-f參數來指明分割之后取出哪一行

比如我們輸入如下命令

ll | cut -d " " -f 1

上一句命令的意思是,對於列出的所有一行一行的字符信息,用-d后面跟的空格字符來進行分割,然后再取出來第一列

不信我們看一下代碼運行的結果

是不是只顯示了第一列了呢?

當然我們現在需要的是所有的文件,不是目錄,所以我們要先把目錄過濾掉,如何過濾目錄,可以參考我的這一篇blog

命令如下

ll | grep "^-"

結合在一起就是

ll | grep "^-"| cut -d " " -f 1

結果如下圖所示

 

當然,我們現在需要的是一列文件的名稱,所以我們抓取字符串的位置不對,也就是cut命令,后面所接的-f的參數1是不對的,至於是幾,我們需要按照空格來split的話,數一數最后一個字符串的位置即可,實際上這里是11

完整的命令是

ll | grep "^-"| cut -d " " -f 11

結果如下圖

沒毛病,然后用head來選取前幾行,比如我們選擇100行,那么命令就是

ll | grep "^-"| cut -d " " -f 11 | head -n100

之后對於這一百行,用xargs參數替換管道命令來進行move就可以啦

so,完整的命令是

ll | grep "^-"| cut -d " " -f 11 | head -n100 | xargs -i mv {} ./val

其中mv后面所跟的中括號意思是前面的字符串,至於為什么要添加-i,我試了一下,如果不添加的話,會爆找不到這個文件夾,我man了一下,發現-i命令的意思是str替換,也就是前面的字符串作為輸入到{}中

試着運行試一下,看看是不是移動到指定的文件夾了呢?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM