How do I create a bash file that creates a symbolic link (linux) for each file moved from Folder A to Folder B [closed]

StackOverflow https://stackoverflow.com/questions/21788630

  •  11-10-2022
  •  | 
  •  

Pergunta

How do I create a bash file that creates a symbolic link (linux) for each file moved from Folder A to Folder B. However, this would be done selecting the 150 biggest current files from Folder A.

Foi útil?

Solução

Can probably write it in a one liner, but easier in a simple bash script like

#!/bin/bash
FolderA="/some/folder/to/copy/from/"
FolderB="/some/folder/to/copy/to/"
while read -r size file; do
  mv -iv "$file" "$FolderB"
  ln -s "${FolderB}${file##*/}" "$file"
done < <(find "$FolderA" -maxdepth 1 -type f -printf '%s %p\n'| sort -rn | head -n150)

Note ${file##*/} removes everything before the last /, per

   ${parameter##word}
          Remove matching prefix pattern.  The word is expanded to produce a pattern just as in  pathname  expansion.   If  the
          pattern  matches  the  beginning of the value of parameter, then the result of the expansion is the expanded value of
          parameter with the shortest matching pattern (the ``#'' case) or the  longest  matching  pattern  (the  ``##''  case)
          deleted.   If parameter is @ or *, the pattern removal operation is applied to each positional parameter in turn, and
          the expansion is the resultant list.  If parameter is an array variable subscripted with @ or *, the pattern  removal
          operation is applied to each member of the array in turn, and the expansion is the resultant list.

Also, it may seem like a good idea to just do for file in $(command), but process substitution and while/read works better in general to avoid word-splitting issues like splitting up files with spaces, etc...

Outras dicas

As with any task, break it up into smaller pieces, and things will fall into place.

Select the biggest 150 files from FolderA

This can be done with du, sort, and awk, the output of which you stuff into an array:

du -h /path/to/FolderA/* | sort -h | head -n150 | awk '{print $2}'

Move files from FolderA into FolderB

Take the list from the last command, and iterate through it:

for file in ${myarray[@]}; do mv "$file" /path/to/FolderB/; done

Make a symlink to the new location

Again, just iterate through the list:

for file in ${myarray[@]; do ln -s "$file" "/path/to/FolderB/${file/*FolderA\/}"; done
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top