How can I remove the last n characters of filenames in a certain directory (in Mac terminal)- unix?

流过昼夜 提交于 2021-01-28 05:43:21

问题


I am trying to rename using "mv", because "rename" command doesn't work in my Mac terminal.

I have a bunch of files named

DTM001_ACGGT-TTAGGC.fq
DTM156_GGTTG-ACAGTG.fq

...etc

I wish to rename them to

DTM001.fq
DTM156.fq

I suppose the easier way is to remove the last 13 characters before the file extension?

I tried these links:

  • mac os x terminal batch rename
  • Rename file by removing last n characters
  • Removing last n characters from Unix Filename before the extension

but none have worked for me, perhaps because I do not fully understand how to manipulate the answers for my specific case or some answers use "rename" command which I cannot access.


回答1:


The macOS Terminal is simply an interface to an interactive program called a shell. The default shell's name is bash.

What you are looking for is known as a shell script, or a bash script, to rename files.

The questions you referenced have the answer. To reiterate:

cd directory_with_the_files
for file in *.fq; do
    mv -vn "${file}" "${file%_*}.fq"
done

You can type this all in at the command line, or place it into a file and execute it with:

bash file_containing_the_commands

This will go through all .fq files in the current directory, renaming them to what you want. The -v option to mv simply means to print the rename as it happens (useful to know that it's doing something), and the -n flag means don't accidentally overwrite any files (in case you type something in wrong or come across duplicate numbers).

All the magic is happening in the ${file%_*}.fq, which says "remove everything after the first _ and add the .fq back". This is known as a "shell parameter expansion," which you can read more about in the Bash Reference Manual. It's somewhat obtusely worded, but here is the relevant bit to this particular use case:

${parameter%word}

The word is expanded to produce a pattern just as in filename expansion. If the pattern matches a trailing portion of the expanded value of parameter, then the result of the expansion is the value of parameter with the shortest matching pattern (the '%' case) deleted.




回答2:


The simplest way is to use rename - see instructions at the end for installation on a Mac.

So, in answer to your question, you can see what would happen if you replace (the command is actually s for "substitute") everything from the first underscore to the end of the filename with .fq:

rename --dry-run  's/_.*/.fq/'   *fq

'DTM001_ACGGT-TTAGGC.fq' would be renamed to 'DTM001.fq'
'DTM156_GGTTG-ACAGTG.fq' would be renamed to 'DTM156.fq'

If that looks good, remove the --dry-run and run it again for real.


You can use rename on your Mac, if you install it. By default, Apple doesn't ship a package manager with macOS. So, many folk use homebrew from the homebrew website.

If you have that, you can simply install rename with:

brew install rename

Then, you'll have a package manager and you can benefit for all sorts of lovely software including new, up-to-date versions of all the out-of-date, ancient versions of your favourite tools that Apple ships:

  • PHP
  • Perl
  • ImageMagick
  • GNU sed
  • GNU awk
  • GNU find
  • GNU Parallel
  • zeromq
  • htop
  • socat
  • sox
  • ffmpeg
  • youtube-dl
  • zenity
  • redis
  • feh
  • mosquitto
  • doxygen
  • pandoc etc.


来源:https://stackoverflow.com/questions/50547881/how-can-i-remove-the-last-n-characters-of-filenames-in-a-certain-directory-in-m

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!